先週、仮想関数の話をしたので、実際の仮想関数の応用をネタに説明を行う。
コンテナクラスライブラリへの応用
まず、コンテナクラスの説明として、配列のソートを仮想関数を用いたら、 どうやって書けるかを資料を見せながら説明する。 純粋基底クラスObjectを定義し、比較の仮想関数を定義し、 class Integer : Object {…} , class Cstring : Object {…} といった派生クラスと、 比較関数を定義すれば、どんなデータ構造のソートも簡単に書けることを説明。
ただ、コンテナクラスは簡単なデータの場合では、実装効率が悪いため、 最近ではTemplate機能が多様されていることを紹介する。 特に、C++ではSTLなどのTemplateライブラリが発達している。
課題と多重継承問題
次に、課題として、GrWin を使ったグラフィックスで、図形クラスFigureを定義し、 その派生クラス class FigureBox : Figure {…} , class FigureCircle : Figure {…} を 生成して、四角や丸を描く処理が書けたり、
Object* array[] = { new FigureBox(...),new FigureCircle(...) } ;
といった異なる図形が混在したデータ構造でプログラムが書けるといった例を説明し、 レポートでは、他の図形を追加せよ…と課題の説明。
この課題のポイントは、色付き図形の扱い。 Figureに色を持たせる、 FigureBoxから色付きFigureBoxを派生させる、 Color基底クラスを作り色付きFigureBoxでは、Figure,Colorの多重継承… といった様々な方法があることを説明する。
んで、様々な考え方の中の多重継承の紹介を行う。 定番の、生物界のクラスで、カモノハシが鳥類と哺乳類の多重継承でプログラムを作ると、 その最上位基底クラス「生物」でを2重で持たないための煩雑さ、 鳥類と哺乳類で同名の別メソッドがあった場合の曖昧さの問題があることを紹介する。 このため、C++では多重継承機能が使えるが、 Javaでは多重継承を禁止し、Interface 機能を使うことを紹介する。