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

标签 c++ polymorphism object-slicing

我想在一个 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/

相关文章:

c++ - 当我尝试调用 main 时,它工作了几次,但后来我遇到了 Segmentation fault

scala - Scala中的家庭多态性

c++ - 多态实现问题

c++ - 避免对象切片

c++ - 基类静态引用数据成员上 C++ 对象切片行为的奇怪情况

c++ - 这是否使用与此 typedef 相同的函数类型(不是指针)的别名

c++ - Unreal 4 C++ Actor 运动

c++ - 如何从一个 map 键列表中减去另一个 map 键列表并获得新 map ( map A - mab B = map C)

java - Java中如何同时使用继承和接口(interface)的多态性?

c++ - 指针和对象切片