vector.push_back(B)和vector.push_back(new A((*B))),为什么不一样呢?

Mah*_*nGM 0 c++ oop inheritance

我有这两个类:

class A
{
public:
    A();
    virtual ~A();

    virtual void TellMyName();
};

class B : public A
{
private:
    std::string szName;
public:
    B();
    ~B();

    void TellMyName();

    void SetName(std::string val){ szName = val; }
};
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

void main()
{
    std::vector<A*> List_A;

    B* B_Instance = new B();
    B_Instance->SetName("B");

    List_A.push_back(B_Instance); // Way 1
    List_A.push_back(new A((*B_Instance))); // Way 2

    List_A[0]->TellMyName();
    List_A[1]->TellMyName();
}
Run Code Online (Sandbox Code Playgroud)

TellMyName()就是要提示一个消息框.如果我使用"方式1"它没有问题,但如果我使用"方式2"它将提示没有文本的消息,这意味着B类的所有成员都是空的,就像他们从来没有被任何东西填满.我通过使用解决了这个问题std::shared_ptr,但是有没有其他方法可以不使用智能指针,因为我必须在一个大项目中实现这种方法,并且会有很多变化和失败.顺便说一下,"Way 2"的原因是什么?

riw*_*alk 6

List_A.push_back(new A((*B_Instance))); // Way 2
Run Code Online (Sandbox Code Playgroud)

这条线没有做你想象的那样.

您正在通过调用C++生成的默认复制构造函数在堆上创建类"A" 的新实例.该复制构造函数使用B的实例(将其视为A的实例)并进行逐字段复制,在这种情况下,它不执行任何操作.

您实际上是在创建A的空实例并将其推送到列表中.

正如许多人所提到的,这个的正式术语称为对象切片.