2013年6月30日日曜日

デストラクタ内の仮想関数

ソースの貼り付け実験も兼ねて。
こうするとデストラクタはTest内で設定したhoge()を読み込んでくれるから大丈夫かなーとか思ったけど、駄目っぽい。
ググると原因は WisdomSoft(旧)仮想関数 の一番下に書かれていた。
デストラクタの実行順は派生クラス→基底クラスなので、基底クラスの仮想関数の中身が書かれた派生クラスのデータは既に破棄されている可能性があるため、デストラクタ内の仮想関数は自分のクラスの物が呼び出されるそうだ。なので、純粋仮想関数だから怒られた。

で、仮想デストラクタを使うらしい。
これでhoge();を使ったデストラクタになるはず。
また、仮想デストラクタでないとTest2のパターンは派生クラスのデストラクタが呼ばれないため、もし派生クラスの方でメモリ解放とかしてるとヤバい。だから基本的には継承させる予定のクラスは仮想デストラクタにしたほうがいいそうだ。ロベールのC++が言ってた。