8

次のコードについて質問があります。

class MyClass : private boost::noncopyable
{
    public:

    MyClass() {}
    virtual ~MyClass() {}
}

class OtherClass : private boost::noncopyable
{
    private:
    MyClass* m_pMyClass;
}

私の考えでは、MyClassは構築または割り当てを使用してコピーすることはできません。サポートしたくないMyClassからのクラスの派生をサポートしたい場合は、仮想デストラクタを使用する必要があります。このクラスへのポインタを作成して渡すつもりはありません。

シングルトンは必要ありません。仮想デストラクタを削除することのマイナス面はわかりません。

コピーできないクラスの仮想デストラクタを削除すると、潜在的な問題が発生しますか?シングルトンである必要はないクラスを処理するためのより良い方法はありますが、別のクラスの1つのインスタンスのみが必要であり、継承はサポートされていませんか?

4

5 に答える 5

13

いいえ、仮想デストラクタの要点は、派生クラスがポリモーフィックに適切に破壊できるようにすることです。これが基本クラスにならない場合は、仮想にする必要はありません。

于 2010-01-12T20:49:28.153 に答える
9

原則として、クラスに仮想関数がある場合、仮想デストラクタが必要です。そうでない場合でも、基本クラスから派生している場合、基本クラス (およびクラス) は仮想デストラクタを必要とする場合と必要としない場合があります。

からクラスを派生させるboost::noncopyableことは、実際には基本クラスから派生したとは見なされません。 boost::noncopyableコンパイラに注釈を強制させるいくつかの宣言でバックアップされた便利な注釈のようなものです。これは、従来の意味での基本クラスではありません。へのポインタまたは参照としてクラスへのポインタを渡そうとする人は誰もいませんboost::noncopyable。そして、彼らが仮想デストラクタを実行したとしても、boost::noncopyableのデストラクタはそうではないため、役に立ちません。

そして最後に、コメントで指摘されたように、あなたは個人的に継承しboost::noncopyableているので、クラス外の人に関する限り、それは実際には継承ではありません。

本当に、仮想デストラクタにする必要はありません。

于 2010-01-12T21:04:13.240 に答える
3

基本クラスの仮想デストラクタは、次のような部分的な破壊の問題を回避するために使用されます。

Base *pBase = new Derived();
delete pBase; 

//if destructor is not made virtual then derived class destructor will never called.

クラスをプライベートに継承する場合、コンパイラは派生クラスから基本クラスへの暗黙的なキャストを実行しません。派生オブジェクトが基本クラス ポインターを使用して破棄されないことが確実な場合は、基本クラスに仮想デストラクタは必要ありません。

Base *pBase = new Derived(); // will flash error 
于 2010-01-12T21:09:10.077 に答える
3

私は、boost::noncopyable クラス全体のファンではありません。クラスのコピーコンストラクターと代入演算子をプライベートに宣言して、それらを定義しないでください。それは同じことを達成し、仮想デストラクタを捨てることができます。

Boost は仮想デストラクタのみを提供するため、人々は boost::noncopyable オブジェクトをポリモーフィックに渡し、それでも適切に動作させることができます。技術的に言えば、クラスをポリモーフィックに使用しない場合 (クラスから継承することもできます)、実際には仮想デストラクタは必要ありません。

于 2010-01-12T20:51:07.417 に答える
1

boost::noncopyableオブジェクトのコピーを作成したくないという意味です。これは、オブジェクトから派生することとは異なることを認識しています。

オブジェクトから派生しない場合は、仮想デストラクタを削除してもまったく問題ありません。「このオブジェクトから派生させない」ポリシーを強制したい場合は、方法があります。残念ながら、boost::nonderivableこれをきれいにする方法はありません。


リンクで述べたように、C++11 ではクラスを宣言できますfinal

class MyClass : final private boost::noncopyable { ... };
于 2010-01-12T21:43:31.447 に答える