仮想デストラクタの明示的な呼び出し
オブジェクトの解体の例で、こう書いたことに注意して欲しい:
T*
が指している先が T
型のオブジェクトである保証は当然無い((この例を出したところの記述では明らかに T
型のオブジェクトですが、一般論としてです。))ので、「 T::~T()
という関数」の呼び出しを要求してはならない。呼び出さなければならないのは、「 ~T
というスロットに入っている仮想関数」だ。
普通の仮想関数と違うのは、スロットの名前が一定していないこと。スロットの名前は、“そのときのポインタの静的な型に「 ~
」を付けたもの”だ。そして、~T
という名前であっても、このスロットに入っているのは T::~T()
かもしれないし D::~D()
かもしれない((もちろん、この D
は T
の公開派生クラスです。))。