Прямое объявление C ++ для виртуальной функции - PullRequest
1 голос
/ 01 мая 2010

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

 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.

Ответы [ 3 ]

1 голос
/ 01 мая 2010

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

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

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

1 голос
/ 01 мая 2010

C / C ++ различают полные типы и неполные типы. Если вы отправите-объявите class C, как это:

class C;

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

Вы можете использовать class C, если вы просто используете C. То, что вы хотите:

class B : public A { virtual class C* test(); };
0 голосов
/ 01 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...