gpt4 book ai didi

c++ - 将派生类对象存储在基类变量中

转载 作者:行者123 更新时间:2023-12-02 10:29:49 24 4
gpt4 key购买 nike

我想将几个类的实例存储在 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”方法是虚拟的。相反,“vect [0]”似乎是“基本”实例,它会打印

BASE



我想我可以编写自己的容器(可能是从 vector 派生的),能够做到这一点(也许只保存指针...)。我只是想问问是否还有更多的C++ ish方法来执行此操作。并且我想完全兼容 vector (为了方便起见,如果其他用户应该使用我的代码)。

最佳答案

您看到的是 Object Slicing
您将派生类的对象存储在应该存储基类对象的 vector 中,这导致对象 slice ,并且所存储对象的派生类特定成员被分割,因此存储在 vector 中的对象仅充当基类的对象。

解决方案:

您应该在 vector 中存储指向基类对象的指针:

vector<Base*> 

通过存储指向基类的指针,将不会进行 slice ,您也可以实现所需的多态行为。
由于您要求这样做的 C++ish方法,因此正确的方法是使用合适的 Smart pointer 而不是将原始指针存储在 vector 中。这样可以确保您不必手动管理内存, RAII 会自动为您执行此操作。

关于c++ - 将派生类对象存储在基类变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62698881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com