クラスの継承
前回《168》、クラス Base を元にして、public派生の形態で派生クラス Derived を作りました。
今回は、private派生の形態で派生クラスを作り、その違いを見てみます。前回同様、基底クラスの名前を Base、派生クラスの名前を Derived とすることにします。
public派生とprivate派生の差異の詳細は、ここでは扱いませんが、いちばん目立つ違いは、次の点だろうと思います。
・ public派生
基底クラスの publicメンバは、派生クラスにおいても publicメンバである。
・ private派生
基底クラスの publicメンバは、派生クラスにおいては privateメンバである。
// ------------------------------------
#include <iostream>
using namespace std;
// 基底クラス Base
class Base {
int x;
public:
Base() : x(99) { }
int get_x() const { return x; }
void set_x(int n) { x = n; }
};
// 派生クラス Derived
class Derived : private Base { // private派生
// private派生の場合、基底クラス Base の publicメンバ
// は、派生クラス内では、privateメンバになります。
public:
int y;
int get_x_() const { return get_x(); }
// 基底クラス Base の publicメンバ関数は、派生クラ
// ス内では private になってしまいますから、
// 利用者は get_x関数 や set_x関数を使うこ
// とができません。
// 利用者が、データメンバ x の値を知る必要があるな
// ら、そのためのゲッタが必要です。
void set_x_(int n) { set_x(n); }
// 利用者が、データメンバ x に値をセットするための
// セッタです。
};
int main()
{
Derived d;
cout << d.get_x_() << '\n'; // 99
d.set_x_(10);
cout << d.get_x_() << '\n'; // 10
d.y = 20;
cout << d.y << '\n'; // 20
cout << d.get_x_() << " " << d.y << '\n'; // 10 20
Base b;
cout << b.get_x() << '\n'; // 99
// b = d; // 不可
// アクセスできない基底クラス Base への変換は許可され
// ていません。
}
// ------------------------------------