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