クラスの継承

Home > 2006-06 / CからC++へ > This Entry [com : 0][Tb : 0]

2006-06-18

今回はクラスの継承についてです。結構複雑な内容になるので、今回は概略だけにとどめ、何度かに分けてお話していければと思います。

継承というのは、他のクラスの持つ性質を受け継いだ別のクラスを定義することを意味しています。具体的な使用例は後回しにして、まずは構文から見ていくことにします。

struct A
{
  int a;
  int foo(int arg);
};

struct B : A
{
  int b;
  void bar();
};

上の例では、クラスAを継承してクラスBを定義しています。このようにクラスを継承するときには、structやclass*1といったクラスキーとクラス名の後に、継承しようとするクラス名をコロン : で区切って記述します。上記では、struct B : A の部分がそれにあたります。

ここで、クラスAをクラスBの基底クラス、クラスBをクラスAの派生クラスと呼びます。継承は(そうした設計の良し悪しは別として)何段階にでも行うことができます。例えば、クラスBを継承してクラスCを定義し、そのクラスCを継承してクラスDを定義し...といった具合にです。

話をクラスAとクラスBに戻します。派生クラスであるクラスBは、クラスAの性質をそのまま継承することになります。すなわち、クラスAのデータメンバであるaは、クラスBでもデータメンバになります。クラスAのメンバ関数であるfooは、クラスBでもメンバ関数になります。つまり、クラスBを外部から見ると、そのメンバは、

struct B
{
  int a;
  int b;
  int foo(int arg);
  void bar();
};

であるかのように扱うことができます。また、これがちょっと難解かもしれませんが、クラスBへのポインタはクラスAへのポインタに暗黙的に型変換することができます。つまり、A*やconst A*を引数として要求している関数に、クラスBへのポインタを実引数として渡すことができるわけです。同様に、クラスAへの参照をクラスBのオブジェクトで初期化することも可能です。

このように、継承を使用することで、クラスの機能拡張を、基底クラスへの差分として記述することができるようになるわけです。


*1 クラスキーが union (つまり共用体)の場合、派生クラスにも基底クラスにもなることができません。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/82-33bed418

C++と組み込み環境 | Page Top▲

New >>
基底クラスのアクセス制御
<< old
演算子の多重定義
ブログ内検索
RSSフィード