1

仮想機能を理解できません。仮想関数をオーバーロードすると、新しい派生関数のみが呼び出されますか? それとも派生関数と基本関数の両方ですか? 仮想デストラクタが呼び出されると、ベースと派生クラスのデストラクタが呼び出されることに気付いたからです。

4

2 に答える 2

4

デストラクタは、この特定の点で特別なメンバー関数です。
仮想基本クラスのデストラクタがある場合は、ポリモーフィック削除中に Base と派生クラスのデストラクタを適切に呼び出します (派生クラス オブジェクトへの基本クラス ポインタ pointinf で delete を呼び出します)。

ただし、他の仮想メンバー関数は、デストラクタと同じ特別なステータスを共有しません。適切なオブジェクト タイプに対して定義された関数のみが呼び出されます。他の関数を呼び出す必要がある場合は、明示的に呼び出す必要があります。

于 2013-02-18T09:48:25.147 に答える
2

派生クラス オブジェクトは、基本クラス オブジェクトの一種のラッパーにすぎません。したがって、デストラクタの場合、両方のデストラクタを呼び出す必要がありますが、これは予想される動作です。

仮想関数の場合、基本クラスの関数を置き換える機会が与えられます。そのため、基本クラス ポインターを使用して派生クラス オブジェクトを保持すると、派生クラスの仮想関数のみが呼び出されます。

于 2013-02-18T09:53:52.907 に答える