我有一个类层次结构,我正在其中编写一个虚函数。说有三个班
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
in ,说它是 的子类?B.h
C
A
谢谢,戈库尔。
我有一个类层次结构,我正在其中编写一个虚函数。说有三个班
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
in ,说它是 的子类?B.h
C
A
谢谢,戈库尔。
C/C++ 区分完整类型和不完整类型。如果你class C
像这样前向声明:
class C;
它将作为不完整类型提供,这意味着您可以声明指向它的指针。但是,在完全声明 C 之前,您不能对它进行子类化,因为此时 C 是不完整的类型。
您可以使用class C
inline 来使用C
. 你想要的是:
class B : public A { virtual class C* test(); };
您只能以三种不同的方式告诉编译器关于类的三件事C
:
如果您想告诉编译器类派生自什么,那么您就是在谈论类的结构。然后,您必须向编译器显示类的声明,别无他法。
没有理由将 B::test() 指定为返回 C*,因为 C* 将始终向下转换为 A*,并且任何正确使用 A 接口的客户端都会期望 A*。如果 B 的客户只期望 C* 他们应该调用不同的函数或负责确保返回的 A* 使用 dynamic_cast 向上转换为 C*。
在 A 类之前前向声明 C 类并让 A::test() 返回 C* 也是非常好的——在这种情况下,当声明指向不完整类型的指针时,子类化没有任何区别。