3

次のコードはC4624を引き起こします。しかし、D は B のサブクラスではないことがわかります。なぜこの警告が表示されるのでしょうか? ありがとう!

class B {
// Uncomment the following line to resolve.
// public:
~B();
};

class D  {B b;};   // C4624 B's destructor not public

警告の詳細:

C4624 : '派生クラス': 基本クラスのデストラクタにアクセスできないため、デストラクタを生成できませんでした

デストラクタは基本クラスでアクセスできなかったため、派生クラスに対して生成されませんでした。この型のオブジェクトをスタックに作成しようとすると、コンパイラ エラーが発生します。

4

2 に答える 2

2

クラス メンバーは、クラスのコンストラクターによって初期化され、デストラクターによって破棄されます。したがって、それらのコンストラクターとデストラクタは、それらの関数内でアクセスできる必要があります。

あなたの例では、プライベート デストラクタがあるため、タイプ のメンバーを破棄する必要があるBのデストラクタにはアクセスできません。DB

エラーメッセージが「基本クラス」を参照している理由はわかりません。投稿したコードからそのエラー メッセージが表示された場合、コンパイラは診断を改善することができます。

于 2012-12-04T14:24:17.980 に答える
0

classDは class のフレンドではなくB、 classBは class の一部ではないためDです。これは、Bのプライベート パーツに のスコープからアクセスできないことを意味しますD。これは、オブジェクトがスコープ外に出て削除する必要がある場合に、 のデストラクタにアクセスできるようにする必要があるため、タイプDまたはスタック上にオブジェクトを作成できないことも意味します。@R.MartinhoFernandesによって正確に言及されたように、エラーメッセージは正しくないようです。プライベート デストラクタは、自分でメモリを管理する場合に役立ちます (ここで説明されているように)。BB

于 2012-12-04T14:27:07.153 に答える