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

时间:2015-12-13 19:23:16

标签: 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;
}

这给出了以下输出:
一个人 C ctor
一个人 B ctor
B dtor
一个dtor

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

1 个答案:

答案 0 :(得分:7)

  1. 创建了C,这构造了A(基类),然后是C
  2. B被创建,这构造了A(基类),然后是B
  3. B被破坏(超出范围),这会破坏B,然后是A(基类)
  4. 永远不会删除C,因此它会被泄露,并且永远不会调用析构函数。