1

重複の可能性:
C++ の純粋な仮想デストラクタ

class A{
    public:
        virtual ~A()=0;
};

class B:public A{
        int *i;
    public:
        ~B() {delete i;}
};

int main(){
    B* temp = new B;
}

B を A の実装にしようとしているだけです。何らかの理由でこれを行うことはできません。

4

2 に答える 2

3

C++ では、デストラクタは純粋仮想にすることができます。

class A{
    public:
        virtual ~A()=0;
};

ただし、いずれの場合も実装する必要があります。

inline A::~A() {} 

それ以外の場合、A は使用可能なクラスではありません。つまり、派生 (S/B) の破壊は不可能です。そして、この行では破壊の可能性が必要です:

  B* temp = new B;

例外がスローされた場合、コンパイラは自動的に一時ファイルを破棄するため...

于 2012-11-04T02:39:30.303 に答える
1

あなたのコメントによると"Yeah i want A to basically be just a container class. Do not want any implementation of A"。クラス B はprotected/private、継承ではなく A からpublic継承されます。 virtual ~A()は許可されてpureいますが、実装を提供する必要があります~A()

class A{
public:
  virtual ~A() = 0
  {
    cout << "~A"<<endl;
  }
};

class B : private /*protected*/ A{
  int *i;
public:
  B() : A(){
    i = new int;
  }
  ~B() {
    delete i;
  }
};

int main(){
    B* temp = new B;
    delete temp;
    return 0;
} 
于 2012-11-04T02:49:09.947 に答える