12

私は持っています

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
};

GCCは私が持っていると主張します

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
   virtual ~IMyInterface(){};
};

理由がわかりません。純粋なインターフェースとは、インターフェースに関するものです(duh)。デストラクタは、インターフェイスの具体的な実装者の内部実装の詳細の一部です。インターフェイスの一部を形成することはありません。私はスライスの問題全体を理解しています(または少なくとも私は理解していると思います)

だから私の質問は-GCCはそれを主張する権利がありますか?もしそうなら、なぜですか?

4

2 に答える 2

25

C ++仕様によると、そうです。

デストラクタを仮想として宣言する必要があります。そうしないと、後で

    IMyInterface * ptr = getARealOne();
    delete ptr;

派生クラスでデストラクタを呼び出さない(デストラクタがVTableにないため)

基本クラスのデストラクタは常にサブクラスのデストラクタによって呼び出されるため、純粋ではない必要があります。

さらに説明すると、C ++には、JavaやC#と同じようなインターフェイスの概念がありません。純粋仮想メソッドのみを使用し、それをインターフェースと考えるのは単なる慣例です。C ++デストラクタに関する他のルールでは、純粋でない必要があり、他の言語のインターフェイスとの類似性が失われますが、これらのルールが作成された時点では、これらの言語は存在していませんでした。

于 2010-07-26T15:50:44.457 に答える
3

基本クラスで仮想d'torを宣言しない場合、基本クラスへのポインターを介して派生クラスのオブジェクトを削除すると、誤ったデストラクタが呼び出され、未定義の動作とリソースリークが発生します。

struct A {

  virtual ~A() {}

};

struct B : A {

   std::string us_constitution;  
};


B* pb = new B();
A* pa = pb;

delete pa; // without the virtual d'tor in the base class, 'B::us_constitution' would never be freed.
于 2010-07-26T15:51:39.820 に答える