将不同对象存储为一种对象类型(c ++)

时间:2014-04-25 19:41:15

标签: c++ class

我搜索了这个,但我觉得我找不到我想要的答案。所以,简单的版本,希望有人可以说“这里是如何”,我会在路上:)

基本上我想要这个:

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类不需要知道这些函数。

2 个答案:

答案 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中的对象不同)。 “存储类”意味着高级模板元编程中的类型列表,这是一种与您的问题无关的技术。

  

(作为基类投射)。

您不需要从子类强制转换为基类。