我想在一个 vector 中存储几个类的实例。由于所有类都继承自同一个基类,这应该是可能的。
想象一下这个程序:
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
virtual void identify ()
{
cout << "BASE" << endl;
}
};
class Derived: public Base
{
public:
virtual void identify ()
{
cout << "DERIVED" << endl;
}
};
int main ()
{
Derived derived;
vector<Base> vect;
vect.push_back(derived);
vect[0].identify();
return 0;
}
我希望它打印 "DERIVED"
,因为 identify()
方法是 virtual
。相反, vect[0]
似乎是一个 Base
实例,它会打印 "BASE"
。
我想我可以编写自己的容器(可能源自 vector
)以某种方式能够做到这一点(可能只保存指针......)。
我只是想问一下是否有更 C++ 的方式来做到这一点。而且我希望完全兼容 vector
(只是为了方便其他用户使用我的代码)。
最佳答案
你看到的是 Object Slicing 。
您将派生类的对象存储在一个 vector 中,该 vector 应该存储基类的对象,这会导致对象切片,并且正在存储的对象的派生类特定成员被切掉,因此存储在 vector 中的对象只是充当基类的对象。
解决方案:
你应该在 vector 中存储指向基类对象的指针:
vector<Base*>
通过存储指向基类的指针,就不会进行切片,并且您也可以实现所需的多态行为。
由于您要求使用 C++ish
方法来执行此操作,因此正确的方法是使用合适的 Smart pointer 而不是在 vector 中存储原始指针。这将确保您不必手动管理内存, RAII 会自动为您完成。
关于c++ - 将派生类对象存储在基类变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777724/