【C++】親クラスのデストラクタをvirtualにしなければならない理由
こんにちは!アーロンと申します。ココナラでは初めてのブログなので、何を書けばよいかイマイチわかりませんが…笑このブログでは、C/C++に関するノウハウを少しずつ書いていければと思います。今日のタイトルは「デストラクタをvirtualにしなければならない理由」です。「そんなの当り前じゃないか!何を今更言ってるんだ!?」と即答できるあなたは、きちんとC++を理解している方だと思います。ですが、残念ながらプロの世界でも、これを知らない人が大勢います。僕は本業でも組み込みエンジニアをしておりますが、この原則を守っていないコードを見ることが多々あります。C++はオブジェクト指向言語ですので、親クラスと子クラスを定義して、いわゆるポリモーフィズムを実現できます。これは、親クラスで定義した仮想関数を、子クラスでオーバーライド(上書き)出来るというものです。この時、子クラスでオーバーライドを許可するメソッド(関数)には、予め親クラス側でvirtualというキーワードをつける必要があります。virtualをつけなければ、子クラスで親クラスのメソッドを上書きできず、親クラスのポインタ経由で子クラスのメソッドを呼び出した場合は、親クラス側のメソッドが呼ばれてしまいます。デストラクタも同じで、virtualをつけなければ、オブジェクトが破棄されるときに、子クラスのデストラクタがコールされません。子クラス側のデストラクタでリソースを開放する処理を記述していた場合は、見事にリソースリークに陥る訳です。<今日の結論>親クラスとして定義するクラスのデストラクタには、必ずvirtualをつけましょう。
0