仅包含基类标头时访问派生类

时间:2016-07-01 17:17:47

标签: c++ class inheritance

我试图了解是否存在为基类设置include指令的方法,但是也能够访问在与基类不同的标头中定义的派生类。例如:

在GenericObject.h中:

class GenericObject { 
    /* whatever - shared properties and methods implemented in .cpp file */ 
}

在Ball.h:

class Ball : public GenericObject { 
    /* whatever - implementation details are in the .cpp file */
}

现在在其他一些实现文件中(我们称之为main.cpp),我有#include d "GenericObject.h"。在main.cpp中,我希望能够访问GenericObject类的成员以及Ball类和GenericObject的任何其他派生类。从我到目前为止的试验中,如果我尝试将它声明为Ball * b;并且因此属于其类的任何成员,编译器将无法识别Ball标识符。

这是因为我的#include'd "GenericObject.h"文件还没有链接,这个派生的Ball类供我访问吗?如果我"#include "Ball.h"我可以正确地识别和使用Ball类,但是我无法想象我应该包含GenericObject类的派生类的所有头文件,对吧?

如果我不得不猜测它是如何工作的,我猜想GenericObject类中Ball类的原型声明会朝着正确的方向迈出一步,但我不确定是否类原型甚至是一件事。

感谢阅读和所有人的反馈!

2 个答案:

答案 0 :(得分:5)

No, you can't use any identifier that's not yet described. This includes any class, whether it derives from a base or not.

It seems to me you are violating Liskov。如果你收到一个引用或指向基数的指针,那么你不应该做任何需要你知道有一个派生的东西。您应该只使用基础接口。因此,您不再需要包含派生类的标题,而您不使用仅在THEIR界面中定义的内容。

答案 1 :(得分:1)

  

我无法想象我应该包含GenericObject类派生类的所有头文件,对吗?

如果要访问从GenericObject派生的任何类,而不是通过指针或引用,则需要#include头文件。

如果您只使用指针和引用,则不需要#include头文件,但仍需要转发声明它们。