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