c++にてデストラクタにvirtual修飾子つけた方がいいのかを調べたりしたので、まとめるよー![中卒ニートでもわかるit講座!]

こんにちは、ミスターPです。

 

c++にてデストラクタ(オブジェクト破棄処理)を実装する際にvirtual修飾子つけた方がいいという考え方があります。

 

なぜか疑問だったので色々調べてみましたー!

 

まず、virtual修飾子をつけることのメリットとしては、

 

同じ名前の関数に別の処理をあてて再利用できるのです!(オーバーライド)

 

 

 

 

・・・

こんなこと言われても何でデストラクタをvirtual定義した方がいいのかわかんねーよっておもいますよね・・・

 

でも割とここ重要なんですよ!

 

どういうことかというと、

 

仮想関数(virtual)で、親クラス(一番上のクラス)を作成することによって、たとえば親クラスで

 

virtual void duel(変数名) というメソッドを作成した上で、子クラスにてvirtual void duel(同じ変数名)を行う処理を変えて再び定義できるんです!

 

内部処理が気になるオタクの皆さんは、どうやって同じ名前なのに変えてるの?と思いますよね。

 

実は、日本語でvirtual関数というだけあり、仮想関数テーブルというテーブルを作成していて、

 

f:id:Mister_P:20200918174253p:plain

わかりやすい図!

 

こういう感じの処理してるんすわ。

 

便利だけど、代償としてテーブルまで作ってるので、破棄しないとメモリずっとくいくいなんです!

 

しかも、いくつこのテーブルの中に処理と紐付けたアドレスを保存しておくかわからないので、テーブルの中はいっぱい入るようにメモリ確保します!

 

virtualデストラクタを使うとテーブルあるかのチェックもあるので、基本的には、少し処理が遅くなるのですが、テーブルを放置してメモリがいっぱいになるリスクと比べるとかなりマシです!

 

動けばいいやって感じで作る人がいる可能性もあるので、デストラクタには、virtual修飾子をつけることを推奨してるのかもしれませんね!