我试图了解是否存在为基类设置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类的原型声明会朝着正确的方向迈出一步,但我不确定是否类原型甚至是一件事。
感谢阅读和所有人的反馈!
答案 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
头文件,但仍需要转发声明它们。