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

解決


wave  2008-06-11 10:24:01  No: 68510  IP: 192.*.*.*

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 10:26:27  No: 68511  IP: 192.*.*.*

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

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

編集 削除
επιστημη  2008-06-11 10:45:40  No: 68512  IP: 192.*.*.*

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

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

編集 削除
wave  2008-06-11 14:46:21  No: 68513  IP: 192.*.*.*

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


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

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

編集 削除
wave  2008-06-12 14:41:18  No: 68514  IP: 192.*.*.*

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

編集 削除