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()"; }
すみません、ソースの一番肝心な部分が抜けてしまいました。
void Test() {
B* c = new(C);
delete c;
}
> 上位のベースクラスでですデストラクタが仮想関数として宣言されている場合には、
> サブクラスのデストラクタが仮想関数かどうかは関係なくなってしまうということでしょうか?
関係なくなるってゆーか、
それより下位のデストラクタは(virtualと書こうが書くまいが)
すべて仮想関数とみなされます。
επιστημηさん、明快なお答えありがとうございます。
> それより下位のデストラクタは(virtualと書こうが書くまいが)
> すべて仮想関数とみなされます。
そういう仕様ということですね、理解しました。
解決チェック入れておきます。
ツイート | ![]() |