创建容器以存储多个类型

时间:2016-09-26 17:58:14

标签: c++ containers

我有一个包含纯虚函数的类。我正在使用这个类来确保我不会忘记在派生类中实现某些方法。

我有一些派生类,比如

class B : public A
class C : public A
class D : public A 
etc

如何创建一个可以容纳所有这些派生类(B,C,D)的容器?我更喜欢使用标准容器,如矢量。我尝试创建基类的向量,但如果将它们推送到向量上,导致派生类被转换,从而导致抽象类类型的无效new-expression的编译错误。

我的基类:

class A
{
public:
    A();
    virtual ~A();

    virtual double GetVolume() = 0;
};

示例派生类:

class B : public A
{
public:
    B(){};
    virtual ~B(){};

    double GetVolume(){};
};

1 个答案:

答案 0 :(得分:4)

您需要创建一个指向基址的容器。基础对象的容器导致从派生到基础的转换,称为切片。但是当你有一个指向基类的指针时,该对象仍然可以具有与基类不同的类型(派生的类型),这称为对象的动态类型(与静态相反)类型)。

在现代C ++中,最好使用智能指针:

std::vector<std::unique_ptr<A>> x;
x.push_back(std::make_unique<B>());
x.push_back(std::make_unique<C>());
x.push_back(std::make_unique<D>());

for (auto& e : x) {
    e->GetVolume();
}