今までは1つのクラスに1つのクラスを継承させてきました。もっと沢山継承させることはできるのでしょうか? 今回はそこに迫ってみたいと思います。
では、今回の要点です。
では、いってみましょう。
全てのクラスを、ある特別なクラスから派生させるようにしたいとします。そのクラスを CFirstClass とし、次の純粋仮想関数を持つようにします。
class CFirstClass { public: virtual const char* GetString() const = 0; }; |
このクラスから派生させておき、関数をオーバーライドしておけば、そのクラスの情報を表示するのが簡単になるというわけです。例えば、
void DispInfo(const CFirstClass& obj) { cout << "そのクラスの情報は " << obj.GetString() << " です。" << endl; } |
この関数に渡せば、CFirstClass から派生していればどんなクラスでも情報が表示できるわけです。本当はもうちょっと便利にできる(cout << obj << endl;とできるようにすることができる)のですが、ここでは割愛します。
これで、自分の作っているクラスであれば、最基底のクラスを CFirstClass から継承するようにして GetString をオーバーライドすれば、GetString を利用できるようになります。
しかし、ライブラリなどから提供されるクラスは普通その定義を変更できません。つまり、CFirstClass を継承させてやることができません。そういう場合は新しくクラスを作ってそのクラスを継承させ、同時に CFirstClass も継承させてやることが必要になるはずです。
もしくは、全てのクラスを CFirstClass から派生させることをやめ、一部のクラスだけ CFirstClass から派生するようにしたいこともあるでしょう。もしそのクラスが既に別のクラスから派生していた場合には、やはり同時に CFirstClass からも派生させる必要があるでしょう。
何もこのような場合だけではありませんが、このように一度に複数のクラスから派生させたいこともあると思います。コンポジション(内包:第2部第22章参照)の方が便利なことが多いのですが、今回のように継承した方がいいこともあります。
しかし、問題があります。一度に沢山のクラスを継承できるのでしょうか? 原理的には継承できても全く問題ありませんが、C++がそれをサポートしているかどうかは話が別です。
こういうときはどうすればいいでしょうか? そう、実験です。とりあえずやってみましょう。
プログラム |
---|
// MulInh1.cpp #include <iostream.h> class CFirstClass { public: virtual const char* GetString() const = 0; }; void DispInfo(const CFirstClass& obj) { cout << "そのクラスの情報は“" << obj.GetString() << "”です。" << endl; } class CNinja{ public: virtual ~CNinja(); }; class CJohnin : public CNinja, public CFirstClass // こんな感じかな? { public: virtual ~CJohnin(); virtual const char* GetString() const; }; CNinja::~CNinja(){ } CJohnin::~CJohnin(){ } const char* CJohnin::GetString() const { return "上忍"; } int main() { CJohnin johnin; DispInfo(johnin); // 果たして上手くいくか? return 0; } |
実行結果 |
そのクラスの情報は“上忍”です。 |
上手くいきましたね。
このように、C++では一度に複数のクラスを継承させることができます。これを多重継承と呼びます。
上の例のように、多重継承はある「機能」をクラスで統括して扱いたいときに必要なことがあります。こういう機能を付け加えたいときはこのクラスから派生して処理をオーバーライドすればいい、とうように、機械を組み立てるような感覚でクラスを作ることができるようになります。そういうことをしていると、いちどに沢山のクラスを継承する必要がでてきます。そういう場合、多重継承が役に立つわけです。
それでは、今回の要点です。
では、また次回。
Last update was done on 2001.5.12
この講座の著作権はロベールが保有しています