« 関数のなかに関数を入れる | トップページ | お気軽にXMLを扱ってみる 其の3 »

2010年6月20日 (日)

基底クラスのデストラクタにvirtualをつけない

また、横道にそれます。

普通、基底クラスのデストラクタにはvirtualをつけます。そうしないと、派生クラスのデストラクタが呼ばれないのです。

たとえば、以下のような場合(かなり強引な感じですが・・・)、

class kihon {
public:
    kihon();
    ~kihon();
};

class hasei : publib kihon {
public:
    hasei();
    virtual ~hasei();
};

kihon* obj = dynamic_cast<kihon*>(new hasei);
delete obj;

deleteしたときに、~kihon()は呼び出されますが、~hasei()は呼ばれません。なので、基本的に基底クラスのデストラクタにはvirtualをつけなくてはなりません。

しかし、デストラクタにvirtualをつけない方が好ましい場合があります。

それは、基底クラスを基底として扱わないときになります。

しかし、デストラクタにvirtualをつけないだけで、基底として扱えなくなるわけでもありません。これは、あくまでも、意思表示みたいなものになります。あと、コンストラクタ、デストラクタをprotectedにしておいた方がよいかと思われます。そもそも、基底として使わないので、deleteとかする必要がないでしょうから。

では、基底クラスを基底として扱わないとはどのような場合になるのでしょうか?

ちょうどいい例がboostライブラリにありました。noncopyableクラスというのを参照していただければ、 基底として扱わない場合の一例を知ることができると思います。

|

« 関数のなかに関数を入れる | トップページ | お気軽にXMLを扱ってみる 其の3 »

C++」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 基底クラスのデストラクタにvirtualをつけない:

« 関数のなかに関数を入れる | トップページ | お気軽にXMLを扱ってみる 其の3 »