新規記事の投稿を行うことで、非表示にすることが可能です。
2017年12月08日
《その168》 クラスの継承(1)
クラスの継承
クラス A を元にして、派生クラス B を作ることが可能です。クラス A が持っている機能をそのまま継承して、さらにそれに新しい機能を付加することができます。
次のプログラムは、自分用のレベルなので初歩の初歩レベルなのですが、派生クラスの作り方や基本事項のいくつかが含まれています。
// ------------------------------------
#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 : public Base {
// Baseクラスを親クラスとして、子クラス Derived を作成。
// public派生なので、基底クラス Base のpublicメンバは、
// 派生クラス Derived においても publicメンバです。
public:
int y;
// 派生クラス Derived 独自のデータメンバです。
};
int main()
{
Derived d;
cout << d.get_x() << '\n'; // 99
// Baseクラスの公開メンバ関数 get_x は、
// 派生クラス Derived の公開メンバ関数です。
d.set_x(10);
// データメンバ x に値をセット。
// Baseクラスの公開メンバ関数 set_x は、
// 派生クラス Derived の公開メンバ関数です。
cout << d.get_x() << '\n'; // 10
// 値が変更されています。
int Derived::*ptr = &Derived::y;
d.*ptr = 20;
// Derivedクラスには、データメンバ y 用のセッタが
// ないので、Derived::y へのポインタ ptr を利用
// して、y に値をセット。
// y は publicメンバなので、単に
// d.y = 20;
// とするだけでいいのに、ちょっと前回《167》の復習
// をしてみたかったので・・・ (*^^*)ゞ
cout << d.y << '\n'; // 20
// 値が変更されています。
cout << d.get_x() << " " << d.y << '\n'; // 10 20
// 現時点での x, y の値です。
Base b;
// Base型のクラス b を作りました。
cout << b.get_x() << '\n'; // 99
// Base のコンストラクタの設定通りの値です。
b = d;
// 基底クラス(親クラス) Base のオブジェクト b に、
// 派生クラス(子クラス) Derived のオブジェクト
// d を代入します。
// b と d は型が違うのですが、大丈夫です。
cout << b.get_x() << '\n'; // 10
// Base のコンストラクタの設定通りの値だったのが、
// オブジェクト d のデータメンバ x の値に変更
// されています。
// b = d; は可能ですが、
// d = b; はできません。 d.y に何を代入したらいい
// のかが分からないからです。
}
// ------------------------------------