virtualの伝播

このBoxクラスをpublic継承しても安全でしょうか?

正解は……この情報だけでは何とも言えない。でした。

一見するとダメっぽいと感じる人も多いかと思います。特にc++のことをちょっと詳しくなった頃の人はまずデストラクタに目が行くかと思います。

デストラクタの前にvirtualが付いていませんね。virtualで無いデストラクタは継承してはいけないということはc++で最初に学ぶことの一つです。

もう少し情報を足して、Objectクラスの定義も見てみましょう。

シンプルです。

virtualが定義されたデストラクタが定義されている模様です。

これではっきりしました。Boxはpublic継承しても安全です。

「Boxをpublic継承しても安全」という表現をもっと詳しく書くと「Boxを継承したクラスをnewで生成して、そのポインタをBox,もしくはObjectのポインタに入れて、deleteを呼んでも安全」ということです。

 

Objectクラスのデストラクタにvirtualが付いているので、Objectをpublic継承している全てのクラスのデストラクタは暗黙にvirtual指定が付きます。

C++では基底クラスでvirtualで定義されたメソッドは、派生先でも 、もれなくvirtualになります。

 

一昔前は派生先のメソッドにvirtualをつけることで、継承元のメソッドをオーバーライドしてますよ的なことを匂わせるアプローチもありましたが今はc++11から追加されたoverrideキーワードがあるのでそちらを使いましょう。

オーバーライドしている意思が明確になり、より可読性の高いコードとなります。また、メソッド名を間違えたりしても、今までは間違った名前で新しいメソッドが作られるだけで不具合の温床になっていましたが、overrideキーワードの恩恵で、基底クラスに無いメソッド名を指定した場合はエラーにしてくれます。素敵ですね!

まとめ

  1. 基底クラスでvirtualだったものは派生先では勝手にvirtualになる
  2. オーバーライドを明示するためにc++11から追加されたoverrideキーワードを使おう

 

Pocket