为什么这是该程序的输出

Why is this the output of this program?

本文关键字:输出 程序 为什么      更新时间:2023-10-16
#include <iostream>
using namespace std;

class  A
{
public:
    A()
    {
        cout << "A ctor" << endl;
    }
    virtual ~A()
    {
        cout << "A dtor" << endl;
    }
    virtual void foo() = 0;
};
class  B : public A
{
public:
    B()
    {
        cout << "B ctor" << endl;
    }
    virtual ~B()
    {
        cout << "B dtor" << endl;
    }
    virtual void foo()
    {
        cout <<"B's foo" << endl;
    }
};
class  C : public A
{
public:
    C() {
        cout << "C ctor" << endl;
    }
    virtual ~C()
    {
        cout << "C dtor" << endl;
    }
    virtual void foo() {cout << "C's foo" << endl;
    }
}; 
int  main ()
{
    C *ptr = new C[1];
    B b;
    return 0;
}

这将给出以下输出:
一个克托
C ctor
一个克托
B ctor
B dtor
一个分叉

我不明白为什么会这样。例如,我知道正在创建一个新的 C 对象,该对象派生自 A,因此 A ctor 首先运行。然后 C ctor 运行。然后我认为 C dtor 运行,但由于某种原因,A ctor 再次运行。

  1. 创建 C,这构造 A(基类(,然后构造 C
  2. 创建 B,构造 A(基类(,然后构造 B
  3. B
  4. 被销毁(超出范围(,这会破坏 B,然后是 A(基类(

C 永远不会被删除,因此它会被泄漏,并且永远不会调用析构函数。