多重継承の説明の前に、オブジェクト指向とは少し違うけど実装方法として 主流となっているテンプレート機能について説明を行う。
テンプレート機能
オブジェクト指向でよく言われる「プログラムの再利用」では、 継承を使った物が多い。 コンテナクラスでは、汎用のデータの入れ物となる純粋仮想基底クラスを宣言し、 自分で取り扱いたいデータ構造がでてくると、基底クラスから派生クラスを作り、 必要最小限の仮想関数を記述するスタイルが一般的。
しかし、純粋仮想基底クラスによるコンテナクラスでは、処理の実装の負荷が高いので、 最近ではテンプレート機能が利用されることが増えた。
template <class T> class Data { private: T data ; public: Data( T x ) : data( x ) {} void print() { cout << data << endl ; } } ; void main() { Data<int> a( 123 ) ; a.print() ; Data<double> b( 1.23 ) ; b.print() ; } ;
このプログラムでは、Data<int> の型が宣言されると、型Tにintが割り当てられ、 int型のDataが宣言され、Data<double> で、double型のDataが作られる。
多重継承
課題としている、純粋基底クラス「図形」から、具体的な「四角」や「丸」の 図形表示クラスを派生させ、さらに「色付」の「四角」や「丸」の図形クラスの プログラムでは、様々な実装方法がある。 一つの方法として、多重継承がある。 複数の異なる基底クラスから派生クラスを作る方法で、課題であれば 「色クラス」と「図形クラス」から、「色付の四角」といったクラスを派生させる。
多重継承は、以下のように書けば良い。
class Figure { public: virtual void draw() ; } ; class Color { private: // 色情報 : } ; class FigureBoxColor : Figure , Color { // FigureとColorの特徴を多重継承 } ;
ただし、多重継承は実装時の複雑さや効率の問題から、 すべてのオブジェクト指向言語で利用できる訳ではない。 Java は、様々な問題を考慮し、多重継承は実装せず、 代わりに interface 機能を用いる。
// 多重継承がややこしい例 class どうぶつ { // } ; class とり : どうぶつ { // 卵生・くちばし } ; class ほにゅうるい : どうぶつ { // 胎生・4つ足 } ; class かものはし : とり , ほにゅうるい { // } ; // (a) とり,ほにゅうるいが、同名のメソッドfoo()を持っていたら、 // かものはし.foo() は、どちらが呼び出されるのか? // (b) どうぶつ が、要素を持っていた場合、 // かものはしは、2つの要素を持つことにならないか?