重複の可能性:
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 の実装にしようとしているだけです。何らかの理由でこれを行うことはできません。
重複の可能性:
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 の実装にしようとしているだけです。何らかの理由でこれを行うことはできません。
C++ では、デストラクタは純粋仮想にすることができます。
class A{
public:
virtual ~A()=0;
};
ただし、いずれの場合も実装する必要があります。
inline A::~A() {}
それ以外の場合、A は使用可能なクラスではありません。つまり、派生 (S/B) の破壊は不可能です。そして、この行では破壊の可能性が必要です:
B* temp = new B;
例外がスローされた場合、コンパイラは自動的に一時ファイルを破棄するため...
あなたのコメントによると"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;
}