2015-12-13 3 views
1
#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; 
} 

Это дает следующий результат:
т е р
С т е р
т е р
В т е р
B dtor
dtorПочему это результат этой программы?

Я не понимаю, почему это происходит. Например, я знаю, что создается новый объект C, полученный из A, поэтому сначала запускается A ctor. Затем выполняется C ctor. И затем я подумал, что C dtor работает, но по какой-то причине A ctor работает снова.

+1

Суперклассы строятся до дочерних классов, то есть A до C и A до B. ptr никогда не разрушается, потому что * ptr был распределен динамически, но b; разрушение выполняется в обратном порядке создания, поэтому ~ B запускается до ~ A для b. –

ответ

7
  1. С создается, это создает A (базовый класс), а затем создается С
  2. В, это создает A (базовый класс), а затем B
  3. Б разрушается (выходит из области видимости), это разрушает B, а затем A (базовый класс)

C никогда не удаляется, поэтому он просочился, и деструкторы никогда не называются.

+0

, что делает так много смысла. – pigthatatepens

Смежные вопросы