C ++虚拟函数的转发声明

时间:2010-05-01 07:37:12

标签: 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.h中包含B.h,通过做某种前瞻性声明,说CA的子类吗?

谢谢, 戈库尔。

3 个答案:

答案 0 :(得分:1)

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

class C;

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

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

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

答案 1 :(得分:1)

你可以用三种不同的方式告诉编译器关于类C的三件事:

  • 它存在。你通过向前声明这个类来做到这一点。
  • 结构如何。你可以通过宣布课程来做到这一点。
  • 它的表现如何。您可以通过定义类'member-functions。
  • 来实现

如果你想告诉编译器这个类派生的是什么,那么你就是在谈论类的结构。然后,您必须向编译器显示类的声明,没有别的办法。

答案 2 :(得分:0)

没有理由将B :: test()指定为返回C *,因为C *将始终向下转换为A *,任何正确使用A接口的客户端都会期望A *。如果B的客户只期望C *,他们应该调用不同的函数或负责确保使用dynamic_cast确保返回的A * upcast到C *。

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