3

次のようなクラスを定義したいと思います。

class IHaveVirtualDestructor
{
public:
    virtual ~IHaveVirtualDestructor();
};

そして、すべてのインターフェイス クラスと抽象クラスがこのクラスを継承するようにします。それは良い習慣ですか?または、すべてのインターフェイス/抽象クラスで独自の仮想デストラクタを定義する必要がありますか? 欠点は何ですか?

4

4 に答える 4

3

努力する価値があるかどうかはわかりませんが、そうするなら、クラスの実装ではなく、その目的を表す名前をクラスに付けます。InterfaceまたはのようなものPolymorphicObject

于 2012-07-16T11:16:52.197 に答える
3

すべてのインターフェイス クラスと抽象クラスにこのクラスを継承させたいと考えています。それは良い習慣ですか?

いいですね。noncopyable利点は、クラスの利点に似ています。

それらから派生したクラスは、一目見ただけで文書化されているように見えますそれ以外の場合は、デストラクタがそうであるかどうかを確認するためにデストラクタの宣言virtualを確認する必要があります。

デフォルトのコンストラクターを作成protectedすることをお勧めします。

class IHaveVirtualDestructor
{
  protected:
     virtual ~IHaveVirtualDestructor() {} //make it protected as well
     IHaveVirtualDestructor() {}
};

おそらくもっと良い名前が必要です:

  • AbstractBase
  • PolymorphicObject (@James Kanze の回答から取得)
于 2012-07-16T11:05:04.860 に答える
3

クラスに仮想デストラクタを追加することを忘れにくいと思うか、IHaveVirtualDestructor を基本クラスとして追加することを忘れにくいと思うかによって異なります。

このようなエラーが怖い場合は、静的コード アナライザーを使用する傾向があります。

そして、クラスの読者について考えてください。IHaveVirtualDestructor を検索する必要があります。仮想でインライン化された空のデストラクタを見るのは、はるかに慣用的です。

よろしくトルステン

于 2012-07-16T11:30:15.323 に答える
0

基本クラスのディストラクタが仮想と定義されている場合、すべてのサブクラスは暗黙的な仮想ディストラクタを持ちます。サブクラスに強制的に仮想ディストラクタを定義させる目的であれば、ディストラクタを純粋仮想として定義するとなお良いでしょう。

于 2012-07-16T11:11:08.993 に答える