List将类转换为父级

ros*_*lav 0 c++ polymorphism

我有以下课程:

class A
{
public:
    A();
    virtual void doSomething() const;
};

class B : public A
{
public:
    B();
    void doSomething() const;
};
Run Code Online (Sandbox Code Playgroud)

然后我有功能:

void putToList(const A &a)
{
   a.doSomething(); // this one depends on what was set as argument A or B class (putToList(A()) or putToList(B()))
   std::list<A> As;
   As.push_back(a);
   As.back().doSomething(); //this always calls doSomething from A
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,从列表中取出后,对象是A,如果阻止它改变类型,如果传递给函数的对象是B类,则使其成为B.

Jos*_*eld 5

类型Asstd::list<A>.它存储A对象.如果您尝试放入一个B对象,它将被切片,您将只获得A它的一部分.每当你从列表中取一个元素时,它就是一个A对象,所以你调用它的任何函数都是它的成员函数A.

在C++中有两种获取多态行为的方法:指针或引用.例如,您可以A在列表中存储指针:

std::list<A*> As;
As.push_back(&a);
As.back()->doSomething();
Run Code Online (Sandbox Code Playgroud)

当然,最好将其包装在智能指针中.

要使用引用,您可以使用std::list<std::reference_wrapper<A>>替代.