p640〜p654まで

昨日(http://d.hatena.ne.jp/niso1985/20080514/1210774822)がっつり間違えた菱形継承。本日はそれを実装するための仮想継承について。

仮想継承

・同じクラスを複数継承した場合、そのすべてにインスタンスが作られる。もし、一つのインスタンスを複数で共有したい場合には仮想継承を用いる。
・仮想継承にするためには継承するクラスにvirtualをつける。
・仮想継承している場合には、例えば菱形継承で、2次クラスで1次クラスのコンストラクタを呼べないので、3次クラスでコンストラクタを呼ぶ必要がある。
・記述上は上記のようになるが、実際にインスタンス化される順番は1次→2次→3次の順。
・記述上、3次クラスで1次クラスを初期化する形になり、2次クラスでは3次クラスで初期化された1次クラスを使うことになるため、扱いに気をつける必要がある。

文字で書くと結構ごちゃごちゃしますね。まぁ忘れたら図で見るとわかりやすいかも?

仮想継承されたクラスの仮想関数

・3次クラスで実装しないと、2次クラスではオブジェクトが1つであるのにもかかわらず複数の実装が存在するためコンパイルエラーとなる。
・ちなみにスコープ解決演算子を用いれば、2次クラスの仮想関数を呼ぶことも可能。(このあたりは多重継承と同じ)
・3次クラスでは実装が一つしかないため、1次クラスへアップキャストが可能。

基本的には仮想継承をすればオブジェクトが一つになると考えればいいっぽい。あとは辻褄が合うかどうか。