2016-04-06 13 views
0

のは、私たちがフォローのようなコードがあるとしましょう:コールは、基本クラスの仮想デストラクタから子孫のメソッドをオーバーライド

class Base{ 
public: 
    virtual ~Base(){PutStat();}; 
    virtual void PutStat(){/* maybe do nothing */}; 
}; 

class Desend : public Base{ 
public: 
    void PutStat() override{/* do something */}; 
}; 

方法PutStatは、いくつかの統計を表示します。 Baseから継承したDescendantsのすべてのインスタンスが、破壊中に自動的に統計メッセージを出力することを願っています。

stat-messageを出力するのが一般的な機能のようですので、PutStatをBaseで一度だけ呼び出す方が、各子孫のPutStatを別々に呼び出すよりも妥当だと思います。

残念ながら、Baseのデストラクタが仮想であるため、オーバーライドされていないPutSatが呼び出されます。

したがって、上書きされたバージョンのPutStatをBaseデストラクタで呼び出す方法。

+2

できません。派生クラスのデストラクタは既に実行されているので、派生クラスのメンバ関数が行うことはできません。 –

+0

できません。基本クラスのデストラクタが呼び出される時点で、派生オブジェクトはもはや存在せず、 'PutStat'の基本クラスバージョンを呼び出すことになります – MikeMB

+0

そして、デストラクタは仮想のbtwではありません。 – MikeMB

答えて

1

残念ながら、Baseのデストラクタは仮想なので、上書きされていないPutSatが呼び出されます。

正解ですが、そのためではありません。バーチャルであるデストラクタはそれとは関係ありません。基本クラスのメソッドは、オブジェクトが基本クラスに部分的に破棄されたために呼び出されます。これは、そのVFTを基本クラスインスタンスのものにすることを含みます。あなたがすることはできませんオーバーライドされたバージョン

を呼び出す方法

。それはなくなった。オブジェクトはなくなっています。それは意味をなさないので、C++は許可しません。

関連する問題