質問: C++でポリモーフィズムを使用する際、基底クラスのデストラクタをvirtualにする必要があるということはよく言われることですが、派生クラスのデストラクタもvirtualとして宣言しておくべきかどうか悩んでいます。 派生クラスのデストラクタも仮想関数でなければならない時というのはどういう時でしょうか。逆に仮想関数じゃなくても良い(vtableへのコストからしないほうがよい場合)時というのはどういう時か、という事も併記して頂けるととても助かります。
回答: `virtual`は派生クラスへ伝播するので、基底クラスのデストラクタが`virtual`であれば、派生クラスのデストラクタも`virtual`となります。 ``` #include class Base { public: virtual ~Base() { std::cout << "~Base()" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "~Derived()" << std::endl; } }; class MoreDerived : public Derived { public: ~MoreDerived() { std::cout << "~MoreDerived()" << std::endl; } }; int main() { Base* b = new MoreDerived(); delete b; return 0; } ``` の出力結果は ``` ~MoreDerived() ~Derived() ~Base() ``` となります。 しかし、以下の記事によれば、ごく一部のコンパイラによっては問題があるかもしれないとのことで、例えば`armcc`は派生クラスのデストラクタに`virtual`を付けないと警告を出すようです。 override - C++ "virtual" keyword for functions in derived classes. Is it necessary? - Stack Overflow