#include<iostream>
using namespace std;
class A
{
public:
int i;
A() {cout<<"A()"<<endl;}
~A() {cout<<"~A()"<<endl;}
};
class B:public A
{
public:
int j;
B(): j(10)
{
this->i=20;
this->~A();
}
};
int main()
{
B abc;
cout<<"i="<<abc.i<<" j="<<abc.j<<endl;
}//main
Два вопроса:Деструктор базового класса называется без разрушения базового класса!
- Почему деструктор A ныряет называют как обычную функцию вместо того, чтобы уничтожить объект? (или это какое-то правило, что базовый класс будет уничтожен только в том случае, если деструктор дочернего класса вызывает деструктор базового класса?) Я попробовал этот примерный код, чтобы узнать, как работает деструктор. Поэтому, если просто вызвать функцию деструктора не разрушает объект, тогда, очевидно, существует другой вид вызова, который вызывает деструктор, и только тогда объект разрушается. Что такого особенного в этом типе звонка и какой звонок?
Есть ли способ иметь список инициализации для A в конструкторе B? Что-то вроде этого:
class B:public A { B(): j(10), A():i(20) {} };
Можете ли вы представить код без Undefined Behavior, который проявляет какую бы то ни было очевидную проблему? Например, код без явного вызова деструктора? –
-1 не записывайте глупый код (т. Е. Уничтожаете свой собственный базовый класс в конструкторе) – Jan
Что на Земле есть 'this-> ~ A();' for? Неужели вы [должны понимать] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), что они делают, прежде чем использовать их? :) – GManNickG