新規記事の投稿を行うことで、非表示にすることが可能です。
2017年12月13日
《その175》 private派生 と public派生
private派生 と public派生
クラス継承の際の、private派生と public派生の相違点を、ここで少しだけ確認しておきたいと思います。
【private派生】
// ------------------------------------
#include <iostream>
using namespace std;
class Aaa { // ◆基底クラス
int a;
public:
Aaa(int n = 10)
: a(n) { }
int get_a() const { return a; }
void set_a(int n) { a = n; }
};
class Bbb : private Aaa { // ◆派生クラス
int b;
public:
Bbb(int n = 30)
: Aaa(n), b(99) { }
int get_b() const { return b; }
};
int main() {
Aaa a1;
// クラスオブジェクト a1 の中身
// 【private】
// ・非公開
// データメンバ a = 10
// 【public】
// ・公開
// メンバ関数 get_a()
// 〃 set_a()
Bbb b1;
// クラスオブジェクト b1 の中身
// 【private】
// ・アクセス不可
// データメンバ a = 30
// ・非公開
// メンバ関数 get_a()
// 〃 set_a()
// データメンバ b = 99
// 【public】
// ・公開
// メンバ関数 get_b()
cout << a1.get_a() << '\n'; // 10
// cout << b1.get_a() << '\n'; // エラー
// 関数"Aaa::get_a"にアクセスできません。
// Aaa* ptr = &b1; // エラー
// アクセスできない基底クラス"Aaa"への変換は
// 許可されていません。
Bbb* ptr = &b1;
// 派生クラス Bbb型オブジェクト b1 への
// ポインタ ptr を定義。
cout << ((Aaa*)ptr)->get_a() << '\n'; // 30
// ポインタ ptr を Aaa*型にアップキャストす
// ると、非公開メンバ関数 get_a()
// にアクセスできるようになります。
cout << b1.get_b() << '\n'; // 99
}
// ------------------------------------
![f04_0006.png](/cplusplus/file/f04_0006.png)
【public派生】
// ------------------------------------
#include <iostream>
using namespace std;
class Aaa { // ◆基底クラス
int a;
public:
Aaa(int n = 10)
: a(n) { }
int get_a() const { return a; }
void set_a(int n) { a = n; }
};
class Bbb : public Aaa { // ◆派生クラス
int b;
public:
Bbb(int n = 30)
: Aaa(n), b(99) { }
int get_b() const { return b; }
};
int main() {
Aaa a1;
// クラスオブジェクト a1 の中身
// 【private】
// ・非公開
// データメンバ a = 10
// 【public】
// ・公開
// メンバ関数 get_a()
// 〃 set_a()
Bbb b1;
// クラスオブジェクト b1 の中身
// 【private】
// ・アクセス不可
// ※関数 get_a(), set_a() 以外
// からのアクセス不可
// データメンバ a = 30
// ・非公開
// データメンバ b = 99
// 【public】
// ・公開
// メンバ関数 get_a()
// 〃 set_a()
// 〃 get_b()
cout << a1.get_a() << '\n'; // 10
cout << b1.get_a() << '\n'; // 30
cout << b1.get_b() << '\n'; // 99
}
// ------------------------------------
![f04_0007.png](/cplusplus/file/f04_0007.png)