我有一个包含纯虚函数的类。我正在使用这个类来确保我不会忘记在派生类中实现某些方法。
我有一些派生类,比如
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(){};
};
答案 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();
}