C++ C++;虚函数的前向声明

C++ C++;虚函数的前向声明,c++,virtual,forward-declaration,C++,Virtual,Forward Declaration,我有一个类层次结构,我正在其中编写一个虚拟函数。假设有三个班 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是a的一个子类,来避免将C.h包含在B.h中 谢谢, Gokul.C/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
a
的一个子类,来避免将
C.h
包含在
B.h

谢谢,
Gokul.

C/C++区分完整类型和不完整类型。如果您像这样转发声明C类:

class C;
它将作为不完整类型提供,这意味着您可以声明指向它的指针。但是,在完全声明C之前,不能对其进行子类化,因为此时C是一个不完整的类型

您可以在只使用
C
的位置内联使用
class C
。你想要的是:

class B : public A { virtual class C* test(); };

没有理由将B::test()指定为返回C*,因为C*将始终向下转换为a*,并且任何正确使用a接口的客户端都将预期为a*。如果B的客户机只需要C*,他们应该调用不同的函数,或者负责确保使用动态_cast将返回的a*上传到C*


在类A之前向前声明类C并让A::test()返回C*-在这种情况下,子类化在声明指向不完整类型的指针时没有任何区别。

关于类
C
,您只能以三种不同的方式告诉编译器三件事:

  • 它的存在。可以通过向前声明类来实现这一点
  • 它是如何构造的。您可以通过声明类来实现这一点
  • 它的行为。您可以通过定义类的成员函数来实现这一点

如果你想告诉编译器这个类是从什么派生的,那么你要说的是这个类是如何构造的。然后必须向编译器显示类的声明,没有其他方法。

我想您没有注意到类A中的虚拟函数包含返回类型A*。所以除非我告诉你C是a的一个子类,否则它是没有意义的(我不想成为C的子类)。如果你觉得你已经回答了我的问题,你能说得更清楚些吗?@Gokul:我想你需要加上“c.h”。无论如何,这看起来有点像设计的味道。@UncleBens:我也认为,这是唯一的办法。但我只是想看看。为什么不需要在B.h中包含C.h?B的任何客户都需要C.h。让我们看一看你的情况。