基本クラスBase
のすべての子孫に対してファイナライズメソッドfinalize()
を宣言する必要があります。破棄の際に呼び出されるべきで、私の意図は純粋なvirtual void Base::finalize() = 0
を~Base()
から呼び出すことでしたが、C++ではそのようなことは禁じられています。だから私の質問はデストラクタから仮想メソッドを呼び出す - 回避策?
どのように私たちは右と暫定的な方法でいくつかのファイナライズ作業を行うことを約束することができますか?コードがコンパイルできないことを
:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
私が作る場合Base::finalize()
純粋仮想ではない、それはそれはすでに破壊されているので、子供に派遣することなく、~Base()
から呼び出されます。
私は子のデストラクタからfinalize()を呼び出すことができますが、それを強制する方法は疑問です。言い換えれば、私の質問は、Baseクラスの子孫を書く人に、ドキュメントでコメントする以外の方法でファイナライズ方法を使用するように指示することが可能なのでしょうか? :)仮想デストラクタが何
私はそれを参照してください、しかし私の質問です:基本クラスの子孫を書く人々は、ドキュメントでそれをコメントする以外の方法で、ファイナライズ方法を使用するよう義務付けることは可能ですか? :) –
'Base'のデストラクタが呼び出されるまでに、' A'のデストラクタが既に呼び出されているので、 'A'オブジェクトは存在しないので、コンパイラやランタイムエラーが発生する可能性があります'finalize()'メソッドを呼び出すことができます。 –
私はあなたのサンプルコードを使用し、 'Base'に' finalize() 'を定義しました。それはコンパイルされますが、実行から何が得られるか見ることができます。 –