C++の仮想デストラクタ
基本クラスへのポインタを使用して派生クラスオブジェクトを削除するには、基本クラスを仮想デストラクタで定義する必要があります。
サンプルコード
#include<iostream>
using namespace std;
class b {
public:
b() {
cout<<"Constructing base \n";
}
virtual ~b() {
cout<<"Destructing base \n";
}
};
class d: public b {
public:
d() {
cout<<"Constructing derived \n";
}
~d() {
cout<<"Destructing derived \n";
}
};
int main(void) {
d *derived = new d();
b *bptr = derived;
delete bptr;
return 0;
} 出力
Constructing base Constructing derived Destructing derived Destructing base
-
C++のインライン仮想関数
C ++の仮想関数は、派生クラスオブジェクトの種類を知らなくても、基本クラスポインターのリストを作成し、任意の派生クラスのメソッドを呼び出すために使用します。仮想関数は、実行時に遅く解決されます。 仮想関数の主な用途は、ランタイムポリモーフィズムを実現することです。インライン関数は、コードの効率を高めるために使用されます。インライン関数のコードは、インライン関数が呼び出されるたびに、コンパイル時のインライン関数呼び出しの時点で置き換えられます。 基本クラスの参照またはポインターを使用して仮想関数を呼び出す場合は常にインライン化できませんが、コンパイラーはコンパイル時にオブジェクトの正確なク
-
C ++で仮想デストラクタを使用するのはいつですか?
効果的なC++のScottMeyersによると- クラスに仮想関数がある場合は、仮想デストラクタが必要です。基本クラスとして設計されていないクラス、または多態的に使用されるように設計されていないクラスは、仮想デストラクタを宣言しないでください。 したがって、ポリモーフィック基本クラスで仮想デストラクタを宣言する必要があります。これは、派生コンストラクターを使用して基本クラスのオブジェクトを作成する場合- Base *b = new Derived(); // use b delete b; Baseのデストラクタが仮想でない場合、この場合、deletebの動作は未定義です。デストラクタへ