c++ - 列表将类转换为父类

标签 c++ polymorphism

我有以下类(class):

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

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

然后我有函数:

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
}

我的问题是,为什么从列表中获取对象后,对象是 A 以及如果我传递给函数的对象属于 B 类,如何防止它更改类型并使其成为 B。

最佳答案

As 的类型是std::list<A> .它存储A对象。如果您尝试将 B对象,它会被切片,你只会得到 A一部分。无论何时从列表中取出一个元素,它都是一个 A对象,因此您调用它的任何函数都将是 A 的成员函数.

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

std::list<A*> As;
As.push_back(&a);
As.back()->doSomething();

当然最好用智能指针包裹起来。

要使用引用,您可以使用 std::list<std::reference_wrapper<A>>相反。

关于c++ - 列表将类转换为父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799678/

相关文章:

sql - JPA标准API : query property of subclass

laravel-5 - Laravel 5 多连接中的多态

c++ - 在初始化全局变量时使用断言宏

c++ - E_NOINTERFACE 返回

c++ - 无法从 "char*"转换为 "char"

rust - 以 &Box<T> 和 &T 作为参数的因式分解方法

Java:使用多态性来避免 if 语句?

c++ - gtest 类型参数化的多态性

c++ - 无法在 Windows 桌面的 Microsoft Visual Studio Express 2013 中打开源文件 GL/glut.h

c++ - 如何在 block 中使用 std::fstream?