1

我有一个类层次结构,我正在其中编写一个虚函数。说有三个班

 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.hin ,说它是 的子类?B.hCA

谢谢,戈库尔。

4

3 回答 3

1

C/C++ 区分完整类型和不完整类型。如果你class C像这样前向声明:

class C;

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

您可以使用class Cinline 来使用C. 你想要的是:

class B : public A { virtual class C* test(); };
于 2010-05-01T07:50:01.163 回答
1

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

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

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

于 2010-05-01T11:16:03.110 回答
0

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

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

于 2010-05-01T08:16:32.377 回答