デストラクタをvirtualにする理由
理由もなくvirtualにしていませんか?
ご存知のとおり、virtualと宣言すると、クラスの初期化や破棄にかかる処理が増えます。必要がない場合は使用を避けるべきなのです。
具体的には以下のとおりです。
- クラスを派生させない場合
- 派生クラスでnewをして、基底クラスからdeleteをしない場合
基底クラスのデストラクタをvirtualにすると、基底クラスのポインタを経由して派生クラスを安全にdeleteする事が出来ます。つまり、それを阻止できるのならばvituralの宣言は不要になるのです。利用者にそのルールを強制するためには、デストラクタをprotectedにします。
つまり、仮想publicデストラクタが必要になるのは・・・
- 基底クラスの関数を呼び出す必要があり、且つ継承しなくてはならない
時が殆どです。当然、基底クラスのprivateやprotectedなデストラクタが仮想で有ることはありません。
なお、オーバーヘッドがある事も理解しているし、上記の事を全て知りながら敢えてvirtual publicなデストラクタを毎回付ける。そういう人も少数ながらいることを追記しておきます。
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/147973/8019397
この記事へのトラックバック一覧です: デストラクタをvirtualにする理由:






コメント
デストラクタをprotectedにしたクラスは、直接deleteができなくなりますが、そこは
private:
BaseClass::destroy()
{
delete this;
}
みたいにして運用で回避するのがセオリーでしょうか?
投稿: kasei_san | 2008/03/19 18:12:22
そもそも、派生クラスの利用者が、基底クラスのポインタからdeleteすることを阻止するためにprotectedにするのです。代わりのメソッドを作っては意味がありません。
基底クラスのポインタからのdeleteを認めるならば、virtualを使う必要があるし、そうでないならprotected。
このへんは「C++ Cording Standards」か「Exceptional C++」あたりで言及されていましたが、今手元にないので確認できません。
投稿: konuma | 2008/03/20 0:40:04