为什么这是这个程序的输出?

pig*_*ens 1 c++ constructor destructor

#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;
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:
A ctor
C ctor
A ctor
B ctor
B dtor
A dtor

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

Jon*_*ter 7

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

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