継承

  あるクラスに宣言されているメンバーをすべて受け継ぎ(継承inheritance ),それに新たなメンバーを付加して新しいクラスを宣言することができます.このとき,基になったクラスを基底クラス基本クラスbase class ),また,派生したクラスを派生クラス導出クラスderived class )と呼びます.

  派生クラスの宣言方法は,
class クラス名 : [アクセス権] 基底クラス名 [,[アクセス権] 基底クラス・・・] {
	変更部分
}		
の方法によります.アクセス権を省略すると,基底クラスが struct ならば public,class ならば private とみなされます.private の場合は,基底クラスのすべてのメンバーは派生クラスのプライベート部に入れられますが,public の場合は,基底クラスのパブリックメンバーはそのまま派生クラスのパブリックメンバーになります.また,基底クラスが複数の場合を多重継承と呼びます.

  派生クラスは,基底クラスからすべてのメンバー変数とメンバー関数を継承します.ただし,コンストラクタ,デストラクタ,代入演算子は継承されません.メンバー変数に対しては,派生クラスのオブジェクト内にメンバー変数を記憶する領域が確保されますが,メンバー関数に関しては,その利用権を受け継ぐだけです.

  プライベートメンバーにアクセスできるのは,そのクラスのメンバー関数かフレンド関数だけです.従って,基底クラスのプライベートメンバーが継承された場合,派生クラスの中で定義されたメンバー関数からは直接アクセスできません(継承されたメンバー関数からはアクセス可能です).

  しかし,基底クラスのパブリックメンバーが,派生クラスのプライベートメンバーに継承された場合は,次のようにして,指定したメンバーだけを派生クラスのパブリックメンバーに引き出すことができます.
class der : Base {
		 ・・・・・
	public:
		Base::z;     // 基底クラスBaseのパブリックメンバー変数
		Base::fun;   // 基底クラスBaseのパブリックメンバー関数
		 ・・・・・
};		
  protected の後ろで宣言されたプロテクティッドメンバーは,継承されても同じプロテクティッドメンバーとなり,基底クラス及び派生クラスのメンバー関数(つまり,階層中にあるメンバー関数)からだけアクセスできます.

  派生クラスに対しては,コンストラクタの記述にも注意が必要です.基本的に,派生クラスの初期設定は,その基底クラスの初期設定が行われてから,実行されます.従って,派生クラスのコンストラクタには,基底クラスの初期設定に必要なパラメータを記述してやる必要があります.もちろん,基底クラスがコンストラクタを持っていなかったり,または,持っていても引数がない場合は必要ありません.逆に,派生クラス自身には,コンストラクタやその引数を必要としなくても,基底クラスにパラメータを送るためにコンストラクタが必要となる場合があります.

  派生クラスのコンストラクタの定義方法を一般的に書けば以下のようになります.
クラス名 :: クラス名 (引数リスト) : 基底クラス名(パラメータリスト) [, 基底クラス名(パラメータリスト)・・・]
{
	このクラスに必要な初期設定
}