Предописание C++ для виртуальной функции

У меня есть иерархия классов, и я пишу виртуальную функцию в ней. Скажите, что существует три класса

 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.

1
задан Prasoon Saurav 1 May 2010 в 07:41
поделиться

3 ответа

Вы можете сказать компилятору только три вещи тремя разными способами о классе C :

  • что он существует. Вы делаете это, объявляя класс вперед.
  • Как это устроено. Вы делаете это, объявляя класс.
  • Как себя ведет. Вы делаете это, определяя функции-члены класса.

Если вы хотите сообщить компилятору, от чего происходит класс, вы говорите о том, как этот класс структурирован. Затем вы должны показать компилятору объявление класса, другого пути нет.

1
ответ дан 3 September 2019 в 00:55
поделиться

Нет причин указывать B :: test () как возвращающий C *, потому что C * всегда будет понижать до A * и любой клиент, правильно использующий интерфейс к A, будет ожидать A *. Если клиенты B ожидают только C *, они должны либо вызвать другую функцию, либо взять на себя ответственность за обеспечение возврата возвращенного A * к C * с помощью dynamic_cast.

Также совершенно нормально объявить класс C перед классом A и заставить A :: test () вернуть C * - подклассы не имеют никакого значения при объявлении указателей на неполные типы в этом случае.

0
ответ дан 3 September 2019 в 00:55
поделиться

В C/C++ различают полные и неполные типы. Если вы объявите класс C следующим образом:

class C;

Он будет доступен как неполный тип, что означает, что вы можете объявить указатель на него. Однако вы не сможете создать его подкласс, пока C не будет объявлен полностью, поскольку C на данный момент является неполным типом.

Вы можете использовать class C inline там, где вы бы просто использовали C. Вот что вам нужно:

class B : public A { virtual class C* test(); };
1
ответ дан 3 September 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: