У меня есть иерархия классов, и я пишу виртуальную функцию в ней. Скажите, что существует три класса
class A { virtual A* test(); }; ( File A.h )
class B : public A { virtual C* test(); }; ( File B.h )
class C : public A {}; ( File C.h )
Теперь это возможный для меня избежать включая C.h
в B.h
, путем выполнения некоторого предописания, говоря это C
подкласс A
?
Спасибо, Gokul.
Вы можете сказать компилятору только три вещи тремя разными способами о классе C
:
Если вы хотите сообщить компилятору, от чего происходит класс, вы говорите о том, как этот класс структурирован. Затем вы должны показать компилятору объявление класса, другого пути нет.
Нет причин указывать B :: test () как возвращающий C *, потому что C * всегда будет понижать до A * и любой клиент, правильно использующий интерфейс к A, будет ожидать A *. Если клиенты B ожидают только C *, они должны либо вызвать другую функцию, либо взять на себя ответственность за обеспечение возврата возвращенного A * к C * с помощью dynamic_cast.
Также совершенно нормально объявить класс C перед классом A и заставить A :: test () вернуть C * - подклассы не имеют никакого значения при объявлении указателей на неполные типы в этом случае.
В C/C++ различают полные и неполные типы. Если вы объявите класс C
следующим образом:
class C;
Он будет доступен как неполный тип, что означает, что вы можете объявить указатель на него. Однако вы не сможете создать его подкласс, пока C не будет объявлен полностью, поскольку C на данный момент является неполным типом.
Вы можете использовать class C
inline там, где вы бы просто использовали C
. Вот что вам нужно:
class B : public A { virtual class C* test(); };