デストラクタをvirtualにする理由

理由もなくvirtualにしていませんか?

ご存知のとおり、virtualと宣言すると、クラスの初期化や破棄にかかる処理が増えます必要がない場合は使用を避けるべきなのです。



具体的には以下のとおりです。

  • クラスを派生させない場合
  • 派生クラスでnewをして、基底クラスからdeleteをしない場合

基底クラスのデストラクタをvirtualにすると、基底クラスのポインタを経由して派生クラスを安全にdeleteする事が出来ます。つまり、それを阻止できるのならばvituralの宣言は不要になるのです。利用者にそのルールを強制するためには、デストラクタをprotectedにします。

つまり、仮想publicデストラクタが必要になるのは・・・

  • 基底クラスの関数を呼び出す必要があり、且つ継承しなくてはならない

時が殆どです。当然、基底クラスのprivateやprotectedなデストラクタが仮想で有ることはありません。

なお、オーバーヘッドがある事も理解しているし、上記の事を全て知りながら敢えてvirtual publicなデストラクタを毎回付ける。そういう人も少数ながらいることを追記しておきます。

Leave a Reply

2 コメント - "デストラクタをvirtualにする理由"

更新通知を受け取る »
avatar
並び替え:   新しい順 | 古い順 | 最も評価の多い
kasei_san
ゲスト

デストラクタをprotectedにしたクラスは、直接deleteができなくなりますが、そこは
private:
BaseClass::destroy()
{
  delete this;
}
みたいにして運用で回避するのがセオリーでしょうか?

konuma
ゲスト

そもそも、派生クラスの利用者が、基底クラスのポインタからdeleteすることを阻止するためにprotectedにするのです。代わりのメソッドを作っては意味がありません。
基底クラスのポインタからのdeleteを認めるならば、virtualを使う必要があるし、そうでないならprotected。
このへんは「C++ Cording Standards」か「Exceptional C++」あたりで言及されていましたが、今手元にないので確認できません。

wpDiscuz