0

このコードがあるとします:

#include <iostream>
using namespace std;

class A
{
protected:
    virtual ~A() { cout << "A destructor reached." << endl;}

    friend class Z; 
};

class B : public A
{
protected:
    virtual ~B() { cout << "B destructor reached." << endl; }
};

class Z
{
public:
    void Test();

    friend class A;
};

void Z::Test()
{
    A* derived = (A*) new B();

    delete derived;
}

int main()
{
    Z test;
    test.Test();
}

B デストラクタが呼び出されるのでしょうか。それは合法ですか?そうでない場合、すべてのクラスを Z の友人から派生させずに、派生コンストラクターを呼び出す方法はありますか?

4

2 に答える 2

1

ここには、少なくとも 2 つの質問が含まれます。

はい、B のデストラクタが呼び出されます。それがポリモーフィズムの仕組みであり、仮想デストラクタの仕組みです。これは設計によるものであり、良いことです。

B では保護されている (またはプライベートでさえある) が、A では仮想的で利用可能な (パブリックなどの) メンバー関数を A* 経由で呼び出すことができるという事実は、最初は少し奇妙に思えるかもしれませんが、これも設計によるものです。代替手段は何ですか?私が見ることができる他の唯一のオプションは、仮想メンバー関数の制限を増やす継承を禁止することです。それはどんな良い目的に役立ちますか?

メソッドをアクセス可能にしたくない場合は、アクセス可能な仮想親メソッドから派生させないでください。

于 2013-08-12T12:01:25.457 に答える