抽象基本クラスの複数のレイヤーを使用して、やや深いオブジェクト指向コードを記述しているシナリオがあり、それぞれに対してデストラクタを明示的に宣言する必要があるかどうか疑問に思っています。
コンパイラーはすでに仮想化されているデフォルトのものを生成しますか、それとも私はそれを指示する必要がありますか?
抽象基本クラスの複数のレイヤーを使用して、やや深いオブジェクト指向コードを記述しているシナリオがあり、それぞれに対してデストラクタを明示的に宣言する必要があるかどうか疑問に思っています。
コンパイラーはすでに仮想化されているデフォルトのものを生成しますか、それとも私はそれを指示する必要がありますか?
デフォルトのデストラクタは仮想ではありません。基本クラスのデストラクタを仮想として宣言すると、サブクラスのデストラクタはオーバーライドされるため、明示的に宣言しなくても仮想になります。
GNU GCCコンパイラは、クラス階層があり、基本クラスがデストラクタを仮想として宣言していない場合でも警告を発します。これは、デストラクタを仮想にしたい可能性が高いためです。
答えはいいえだ。ここでの唯一の関連要件は、vtableを持つクラス(つまり、少なくとも1つの仮想関数を持つクラス)には、継承チェーンのどこかに少なくとも1つの仮想デストラクタが必要であるということです。通常、これは、基本的な基本クラスが空の仮想デストラクタを提供することを意味します。
一般に、一部の関数が基本クラスで仮想として宣言されている場合、サブクラスで仮想として明示的に宣言する必要はありません。ただし、それは良い習慣です。
サブクラスのデストラクタを明示的に仮想として宣言しても、重大な利点はありません。したがって、もう1つ仮想を記述したくない場合は、それを行わないでください。