デストラクタを仮想関数にしたとき動き(1)

解決


wave  2008-06-11 19:24:01  No: 68510

MSVS2008を使用して、以下のソースを実行すると

A()B()C()~B()~A()

と出力されることを期待していたのですが、実際には

A()B()C()~C()~B()~A()

となります。この理由がわかりません。

上位のベースクラスでですデストラクタが仮想関数として宣言されている場合には、
サブクラスのデストラクタが仮想関数かどうかは関係なくなってしまうということでしょうか?

C++の使用としてこの動きで正しいかだけでも教えて頂けると助かります。
よろしくお願いします。

class A {
public:
        A();
        virtual ~A();
};
A::A() { cout << "A()"; }
A::~A() { cout << "~A()"; }

class B : public A {
public:
        B();
        ~B();
};
B::B() { cout << "B()" ; }
B::~B() { cout << "~B()" ; }

class C : public B {
public:
        C();
        ~C();
};
C::C() { cout << "C()"; }
C::~C() { cout << "~C()"; }


wave  2008-06-11 19:26:27  No: 68511

すみません、ソースの一番肝心な部分が抜けてしまいました。

void Test() {
        B* c = new(C);
        delete c;
}


επιστημη  2008-06-11 19:45:40  No: 68512

> 上位のベースクラスでですデストラクタが仮想関数として宣言されている場合には、
> サブクラスのデストラクタが仮想関数かどうかは関係なくなってしまうということでしょうか?

関係なくなるってゆーか、
それより下位のデストラクタは(virtualと書こうが書くまいが)
すべて仮想関数とみなされます。


wave  2008-06-11 23:46:21  No: 68513

επιστημηさん、明快なお答えありがとうございます。

> それより下位のデストラクタは(virtualと書こうが書くまいが)
> すべて仮想関数とみなされます。

そういう仕様ということですね、理解しました。


wave  2008-06-12 23:41:18  No: 68514

解決チェック入れておきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加