ホーム » スタッフ » 斉藤徹 » 多重継承

2012年6月
« 5月   7月 »
 12
3456789
10111213141516
17181920212223
24252627282930

最近の投稿(電子情報)

アーカイブ

カテゴリー

多重継承

多重継承の説明の前に、オブジェクト指向とは少し違うけど実装方法として 主流となっているテンプレート機能について説明を行う。

テンプレート機能

オブジェクト指向でよく言われる「プログラムの再利用」では、 継承を使った物が多い。 コンテナクラスでは、汎用のデータの入れ物となる純粋仮想基底クラスを宣言し、 自分で取り扱いたいデータ構造がでてくると、基底クラスから派生クラスを作り、 必要最小限の仮想関数を記述するスタイルが一般的。

しかし、純粋仮想基底クラスによるコンテナクラスでは、処理の実装の負荷が高いので、 最近ではテンプレート機能が利用されることが増えた。

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つの要素を持つことにならないか?