1

クラスAから継承したいのですが、Aのデストラクタは仮想ではなく、Aの定義を変更できません。次のケースを回避するにはどうすればよいですか?

struct A
{
    A()
        : a(new char[8])
    {}

    ~A()
    {
        delete[] a;
    }

    char* a;
}

struct B : A
{
    B()
        : A(), b(new char[8])
    {}

    ~B()
    {
        delete[] b;
    }

    char* b;
};

int main()
{
    A* p_a = new B;
    delete p_a; // How to avoid such a dangerous deletion?
}
4

3 に答える 3

8

基本クラスに仮想デストラクタがなく、クラス定義を変更できない場合は、ほとんど運がありません。一般的な経験則として、仮想デストラクタを持たない基本クラスでパブリック継承を使用しないでください。

継承の代わりに構成を使用してみることができますか? のインスタンスをAinBに配置し、 のメンバー関数への呼び出しをラップするパブリック メンバー関数を提供しますA

于 2013-02-11T04:47:51.910 に答える
1

のアクセスできないベースであるstruct B : private Aように使用できます。AB

于 2013-02-11T04:46:20.600 に答える
0

A基本クラスの代わりにデータメンバーを作成するだけです。


ちなみに、クラスは災害への招待状である3つのルールに違反しています。インスタンスがコピーされた場合はどうなりますか。明示的なnewandの代わりに、標準ライブラリ コンテナーを使用することをお勧めしdeleteます。

于 2013-02-11T05:47:42.000 に答える