【C++】 デストラクタからオーバーライドされた仮想関数が呼べない

2009-06-10

デストラクタとは別の解放用の関数が仮想関数になってるとして、基底クラスのデストラクタから呼び出しておけば自動的に呼び出されるものかと思ってた。

#include <iostream>
using namespace std;

struct Base {
virtual ~Base() {
terminate(); // <- ここで仮想関数呼び出し*/
cout << "~Base" << endl;
}
virtual void terminate() { cout << "Base::terminate()" << endl; }
};

struct Derived : public Base {
virtual ~Derived() { cout << "~Derived" << endl; }
virtual void terminate() { cout << "Derived::terminate()" << endl; }
};

int main() {
Base* p = new Derived();
delete p;
return 0;
}

結果: Derived::terminate() が呼ばれない

~Derived
Base::Terminate()
~Base

やべーマジで知らなかった。 今までこういうことをしてなかったかすげー不安。

というかなんでこういう仕様になってるんだろう?不便だと思うんだけど?わざわざvtableを書き換えてるのかな。