前回の派生と継承のイメージを改めて記載する。2このような処理でのデータ構造は、次のようなイメージで表される。オブジェクトがあったが、それをひとまとめで扱いたいこともある。}}C++では、Personへのポインタの配列に代入する時、Student型ポインタは、その基底クラスへのポインタとしても扱える。クラスのデータして扱われる。このため、このプログラムを動かすと、以下のように、名前と年齢だけが3人分表示される。Person*型,Student*型を混在して保存をした。データを表示しても、所属・学年は表示されない。いう要素を追加し、type=1ならば、Student型として扱うようにしてみた。初期化といったことを記述する必要がある。派生したクラスの種類がいくつもあるのなら、型情報の代入は注意深く書かないとバグの元になるし、型に応じた分岐は巨大なものになるだろう。文が問題となっていた。Function)が使える。このような関数を、仮想関数と呼ぶ。プログラム上で見えないが、何らかの型情報をオブジェクトの中に保存してくれる。仮想関数が呼び出されると、その型情報を元に、ふさわしい関数を自動的に呼び出してくれる。いった極めて簡単に記述できるようになる。関数ポインタ仮想関数の仕組みを実現するためには、関数ポインタが使われる。;}仮想関数を使うクラスが宣言されると、一般的にそのコンストラクタでは、各クラス毎の仮想関数へのポインタのテーブルが型情報として保存されるのが一般的。仮想関数の呼び出しでは、仮想関数へのポインタを使って処理を呼び出す。このため効率よく仮想関数を動かすことができる。課題で取り組んでいるプログラムは、純粋仮想基底クラスFigureと、そこから派生させたクラスと仮想関数で絵を書いている。このような派生の関係を以下のような図で表現する。課題では、上記プログラムを活用して、色付き図形のクラスを作ることを目的とするが、その実装方法には色々な方法がある。派生させる方法だろう。処理を共通化できればプログラムを書く手間を減らせるはず。派生させた場合は、四角を描く処理が継承により共通化ができた。派生させる...といったクラスを沢山作る場合は、色を変える処理を何度も使うことになるが、処理の共有することができない。いった場合は、以下のような方法がある。ように複数のクラスをもつ継承は、多重継承と呼ばれる。多重継承は後に示すような曖昧さや、実装の際の手間を考えると、多重継承は必ずしも便利な機能ではない。このため、オブジェクト指向のプログラミング言語によっては、多重継承機能が使えない。ような言語での多重継承が問題となる事例として、ダイヤモンド型の継承が挙げられる。動物クラスから鳥クラス・哺乳類クラスを派生して、鳥クラスからニワトリを派生して、哺乳類クラスから人間を派生するというのは、進化の過程を踏まえると、自然な派生と考えられる。鳥がクラスメンバーとして羽と足を持ち、哺乳類が手と足を持つとしたとき、鳥のくちばしを持ち卵を生むカモノハシを派生する場合には、どうすれば良いのだろうか?しかし、これを鳥と哺乳類を親クラスとした多重継承で実装をすると、手と羽と足が4本のカモノハシができてしまう。(お前はドラゴンかッ!)また、大元の動物クラスがインスタンスを持つ場合、このような多重継承をすると、同じ名前のインスタンスを2つ持つことになる。この場合、C++では仮想継承というメカニズムを使うことができる。;また、動物が動くためのmove()というメソッドを持つとした場合、鳥は羽で飛び、哺乳類は足で移動する処理となるだろう。使うのだろうか?こういった、使いにくさ・実装時の手間・処理の曖昧さを考慮したうえで、多重継承のメカニズムが使えるオブジェクト指向プログラム言語は少ない。Person型で表示処理が行われる。Student型とPerson型の機能を活かせないだろうか?仮想関数このような場合、オブジェクト指向では、仮想関数の機能が便利である。2}仮想関数が宣言されると、基底クラスの中に「型情報(PersonなのかStudentなのか)」が自動的に埋め込まれる。仮想関数を呼び出すと、型情報を使って、Person::print()を呼び出すか、Student::print()を呼び出すか、を選んでくれる。プログラム記述に向いていた。いった型のようなものとする。文を大量に書き並べないといけないし、データ型を区別するための情報(下記の例ならばtype)に、型毎に異なるマジックナンバーを埋め込む処理を自分で書かないといけない。}}関数ポインタでは、仮想関数はどのようなテクニックを用いて実装されているのだろうか?これには、関数ポインタが用いられる。;}仮想関数を用いると、基底クラスにはクラス毎の仮想関数への「関数ポインタ」などの型情報を保存する場所が自動的に作られ、基底クラス・派生クラスが使われると、そのオブジェクト毎に型情報を初期化する処理が行われる。中身の無い純粋基底クラスを記述しない時の書き方。Objectという純粋仮想基底クラスを通して、共通な型のように扱えるようになる。広く利用され、Objectのような基底クラスは、純粋仮想基底クラスなどと呼ばれる。