本当に詳しい内容はググるとして・・・。
- virtualは、継承(オーバーライド)していいよという意志の現れ。
- 逆にvirtualがなければ、断固継承(オーバーライド)させない!という意志の現れ。
という感じか。
以下 VC++で動かしながらメモ
- 親でvirtual付けた関数は、子で同じ名前のAPIを作ると「オーバーライド」となり、子の関数が呼ばれる。
- 親でvirtual付けない関数は、オーバーライドされずに親の関数が呼ばれる。つまり子のAPI完全無視。
- 逆に言えばvirtual付けないことでオーバーライドを禁止できる。
- コンストラクタは特別でvirtualつけなくても子を生成すると親のデフォルトコンストラクタが続いて呼ばれます。
- コンストラクタにvirtual付けたらコンパイラに怒られる
- デストラクタはまた特別な動きがあって、virtualつけると子のデストラクタ->親のデストラクタという順番で呼ばれます。
- 逆につけないと親のデストラクタしか呼ばれない
- デストラクタには、何はともあれ virtual付けるのはこういう理由か。
- 継承しないクラスにはvirtualつけても意味なし。
- 親に引数付きコンストラクタがあっても、継承した子クラスからは呼ぶ方法がないっぽい。