2016-01-15 2 views
0

У меня есть некоторые сомнения относительно результата следующего фрагмента. Заранее спасибо! Почему не называется деструктор B1? По-моему, «Dest B» должен отображаться перед «Dest A» . Любое объяснение будет оценено.Порядок выполнения деструктора в C++

class A1 { 
    public: 
     A1() { cout << "Const A" << endl; } 
     ~A1() { cout << "Dest A" << endl; } 
     virtual const char* ClassName() const{ return ("A"); } 
}; 

class B1:public A1 { 
    public: 
     B1() { cout << "Const B" << endl; } 
     ~B1() { cout << "Dest B" << endl; } 
     virtual const char* ClassName() const { return ("B"); } 
}; 

void foo1(A1 *a1) 
{ 
    cout << "foo1 has been passed an object of class " << a1->ClassName() << endl; 
    delete a1; 
} 


int main() 
{ 
    B1 *b1 = new B1; 
    foo1(b1); 
    return 0; 
} 
+0

Каковы ваши «сомнения»? Какой у Вас вопрос? –

+0

Код, который вы нам указали, не вызывает никакого деструктора, и он не соответствует выведенному вами выводу. Он даже не компилируется, не подумайте об этом. –

+0

Извините за мое плохое редактирование. Теперь вопрос правильно отредактирован. –

ответ

6

Поскольку ваш класс A1 имеет не-виртуальный деструктор, ваш delete a1 производит неопределенное поведение. Неправильно применять delete к указателю типа A1 *, когда указатель фактически указывает на объект B1, если только класс A1 не имеет виртуального деструктора.

То, что вы наблюдаете, является лишь определенным проявлением неопределенного поведения.

Объявите деструктор A1 как virtual, и вы должны начать следить за правильным поведением.

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