いいえ、あなたはbeseクラスのデストラクタを呼び出すことはありません、それは常に他の人のように自動的に呼び出されるが指摘したが、ここでの結果とのコンセプトの証明ですしている:
class base {
public:
base()
{
cout << __FUNCTION__ << endl;
}
~base()
{
cout << __FUNCTION__ << endl;
}
};
class derived : public base {
public:
derived()
{
cout << __FUNCTION__ << endl;
}
~derived()
{
cout << __FUNCTION__ << endl;
} // adding call to base::~base() here results in double call to base destructor
};
int main()
{
cout << "case 1, declared as local variable on stack" << endl << endl;
{
derived d1;
}
cout << endl << endl;
cout << "case 2, created using new, assigned to derive class" << endl << endl;
derived * d2 = new derived;
delete d2;
cout << endl << endl;
cout << "case 3, created with new, assigned to base class" << endl << endl;
base * d3 = new derived;
delete d3;
cout << endl;
return 0;
}
出力は次のようになります。
case 1, declared as local variable on stack
base::base
derived::derived
derived::~derived
base::~base
case 2, created using new, assigned to derive class
base::base
derived::derived
derived::~derived
base::~base
case 3, created with new, assigned to base class
base::base
derived::derived
base::~base
Press any key to continue . . .
基本クラスのデストラクタを仮想として設定した場合、結果はケース1と同じです。& 2.
出典
2017-09-21 19:51:49
zar
純粋仮想デストラクタはどうですか?私のリンカは、継承されたクラスの非仮想デストラクタの終わりにそれを呼び出そうとしています。 – cjcurrie
ボディを持たない純粋な仮想デストラクタを持つことはできません。ただそれに空の体を与えてください。通常の純粋仮想メソッドでは、オーバーライド関数が代わりに呼び出され、デストラクタとともに呼び出されます。したがって、本体を用意する必要があります。 = 0は、それがオーバーライドされなければならないことを意味します。したがって、必要な場合には便利なコンストラクトです。 –
この質問は関連し、[質問/ 15265106/c-a-missing-vtable-error](http://stackoverflow.com/questions/15265106/c-a-missing-vtable-error)と関連している可能性があります。 –