我搜索了这个,但我觉得我找不到我想要的答案。所以,简单的版本,希望有人可以说“这里是如何”,我会在路上:)
基本上我想要这个:
class BaseObject
{
public:
BaseObject();
~BaseObject();
virtual bool FunctionX() =0;
virtual bool FunctionY() =0;
};
class ObjectA : BaseObject
{
public:
ObjectA();
~ObjectA();
bool FunctionX();
bool FunctionY();
bool FunctionZ();
};
..与上面的ObjectB相同..
...
vector<BaseObject*> myList;
ObjectA a;
ObjectB b;
myList.push_back((BaseObject*)&a);
myList.push_back((BaseObject*)&b);
myList.back()->FunctionX();
我知道上面的代码是错误的,我只是试图让整体概念结束。
我需要什么:
一个基类,它定义了必须存在于从它继承的类中的函数。
能够将从它继承的类存储在同一个向量中(强制转换为基类)。
知道它的向量可以调用基类定义的函数。
这些类能够拥有自己的附加函数,而vector / base类不需要知道这些函数。
答案 0 :(得分:2)
我刚注意到,你是私下派生的。 BaseObject是ObjectA的私有基类。省略继承说明符时,默认情况下会获得私有继承。将ObjectA声明更改为
class ObjectA : public BaseObject...
否则,不允许ObjectA范围之外的代码知道ObjectA是一个BaseObject。
答案 1 :(得分:0)
您的代码几乎是正确的。它错过了virtual
的{{1}}析构函数,但它会在任何典型的使用场景中调用未定义的行为(例如崩溃)。这是正确的声明:
BaseObject
您应该考虑的另一件事是让您的公共函数非虚拟,虚拟函数是私有的,公共函数委托给私有函数(Herb Sutter称为Non-Virtual Interface Idiom)。
还有一些事情:
定义必须存在于类中的函数的基类 继承自它。
至少在字面意义上,你无法通过任何正常手段实现这一目标。类可以从您的抽象类派生,但通过不定义纯虚函数来保持自己的抽象。
能够存储从中继承的所有类 向量
注意“阶级”和“对象”之间的区别。向量不存储类而是存储对象。在C ++中,类不能用作对象(例如,Java中的对象不同)。 “存储类”意味着高级模板元编程中的类型列表,这是一种与您的问题无关的技术。
(作为基类投射)。
您不需要从子类强制转换为基类。