Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。5,022件21C++でポリモーフィズムを使用する際、基底クラスのデストラクタをvirtualにする必要があるということはよく言われることですが、派生クラスのデストラクタもvirtualとして宣言しておくべきかどうか悩んでいます。派生クラスのデストラクタも仮想関数でなければならない時というのはどういう時でしょうか。逆に仮想関数じゃなくても良い(vtableへのコストからしないほうがよい場合)時というのはどういう時か、という事も併記して頂けるととても助かります。票6基底クラスのデストラクタをvirtualにすると自動的にその派生クラスのデストラクタもvirtualになります。デストラクタに限らず基底クラスでvirtualと宣言した関数は派生クラスでvirtualと宣言しようとしまいとvirtualとして扱われます。本家SOの似た質問のリンクを貼っておきます。一応仕様書を抜粋しておきます。|4基底クラスのデストラクタがvirtualなら、派生クラスのデストラクタにもそれが伝播して自動的にvirtualになります。回答としては「気にしなくてもいい」だと思いますが、明示するためにvirtualと書いておいた方がいいかもしれません。|4virtualは派生クラスへ伝播するので、基底クラスのデストラクタがvirtualであれば、派生クラスのデストラクタもvirtualとなります。0;}の出力結果は~MoreDerived()~Derived()~Base()となります。以下の記事によれば、ごく一部のコンパイラによっては問題があるかもしれないとのことで、例えばarmccは派生クラスのデストラクタにvirtualを付けないと警告を出すようです。11:24Rippleさんの貼られた仕様によると、その解釈で問題ないようです。|2派生クラスのデストラクタもvirtualとして宣言しておくべきかどうか古いコンパイラも動作対象として考慮に入れるならば、宣言しておいたほうが良いでしょう。派生クラスのデストラクタも仮想関数でなければならない時というのはどういう時でしょうか。基底クラスのデストラクタが仮想関数の時は常に、です。エラーや警告を出したりするものがありました。最近のコンパイラは自動で仮想関数として扱うようになったのでしょう。逆に仮想関数じゃなくても良い(vtableへのコストからしないほうがよい場合)時というのはどういう時か現在では、あるとは考えにくいです。「基底クラスのデストラクタが仮想関数でなければならない理由」の方です。再派生される可能性などを考えると、ほぼ意味がありません。そんな手段を取る合理的理由は考えにくいのではないでしょうか。個の銅バッジ2少なくともC++98のときから明確に仕様として記述があるようなので、非準拠のコンパイラのことは無視していいと思います。大丈夫だからおっけーとは言えないのです。|1基底クラスでデストラクタが仮想ならば派生クラスでも仮想になるのは他の回答者のおっしゃる通りです。ポリモーフィズム的に使うつもりはないが、public継承することは前提の基底クラスに関しては、仮想でないデストラクタをprotectedにする、というテクニックがあるようです。これなら危険を回避できます。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。