次のようなクラスを定義したいと思います。
class IHaveVirtualDestructor
{
public:
virtual ~IHaveVirtualDestructor();
};
そして、すべてのインターフェイス クラスと抽象クラスがこのクラスを継承するようにします。それは良い習慣ですか?または、すべてのインターフェイス/抽象クラスで独自の仮想デストラクタを定義する必要がありますか? 欠点は何ですか?
次のようなクラスを定義したいと思います。
class IHaveVirtualDestructor
{
public:
virtual ~IHaveVirtualDestructor();
};
そして、すべてのインターフェイス クラスと抽象クラスがこのクラスを継承するようにします。それは良い習慣ですか?または、すべてのインターフェイス/抽象クラスで独自の仮想デストラクタを定義する必要がありますか? 欠点は何ですか?
努力する価値があるかどうかはわかりませんが、そうするなら、クラスの実装ではなく、その目的を表す名前をクラスに付けます。Interface
またはのようなものPolymorphicObject
。
すべてのインターフェイス クラスと抽象クラスにこのクラスを継承させたいと考えています。それは良い習慣ですか?
いいですね。noncopyable
利点は、クラスの利点に似ています。
それらから派生したクラスは、一目見ただけで文書化されているように見えます。それ以外の場合は、デストラクタがそうであるかどうかを確認するためにデストラクタの宣言virtual
を確認する必要があります。
デフォルトのコンストラクターを作成protected
することをお勧めします。
class IHaveVirtualDestructor
{
protected:
virtual ~IHaveVirtualDestructor() {} //make it protected as well
IHaveVirtualDestructor() {}
};
おそらくもっと良い名前が必要です:
クラスに仮想デストラクタを追加することを忘れにくいと思うか、IHaveVirtualDestructor を基本クラスとして追加することを忘れにくいと思うかによって異なります。
このようなエラーが怖い場合は、静的コード アナライザーを使用する傾向があります。
そして、クラスの読者について考えてください。IHaveVirtualDestructor を検索する必要があります。仮想でインライン化された空のデストラクタを見るのは、はるかに慣用的です。
よろしくトルステン
基本クラスのディストラクタが仮想と定義されている場合、すべてのサブクラスは暗黙的な仮想ディストラクタを持ちます。サブクラスに強制的に仮想ディストラクタを定義させる目的であれば、ディストラクタを純粋仮想として定義するとなお良いでしょう。