2017年12月15日
《その178》 クラスのメンバーへのアクセス
クラスのメンバーが、例えば、次の a, b, c である場合、
private:
int a;
protected:
int b;
public:
int c;
a には、定義されたクラスの メンバー関数,フレンド関数からアクセスできます。
b には、定義されたクラスやその派生クラスの メンバー関数,フレンド関数からアクセスできます。
c には、どこからでもアクセスできます。
さらに、このクラスからの private派生,protected派生,public派生 による派生クラスの場合には、a, b, c へのアクセス可否がどのようになるのか、一応、確認してみました。
// ------------------------------------
using namespace std;
/* 基底クラス(親クラス) */
class Class00 {
private:
int a;
protected:
int b;
public:
int c;
Class00() : a(10), b(20), c(30) { }
void get_a() { cout << a << '\n'; }
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
};
// ------------------
/* private派生(子クラス) */
class Class11 : private Class00 {
public:
// void get_a() { cout << a << '\n'; } // エラー
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
};
/* private派生(孫クラス) */
class Class12 : private Class11 {
public:
// void get_a() { cout << a << '\n'; } // エラー
// void get_b() { cout << b << '\n'; } // エラー
// void get_c() { cout << c << '\n'; } // エラー
};
// ------------------
/* protected派生(子クラス) */
class Class21 : protected Class00 {
public:
// void get_a() { cout << a << '\n'; } // エラー
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
};
/* protected派生(孫クラス) */
class Class22 : protected Class21 {
public:
// void get_a() { cout << a << '\n'; } // エラー
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
};
// ------------------
/* public派生(子クラス) */
class Class31 : public Class00 {
public:
// void get_a() { cout << a << '\n'; } // エラー
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
// ゲッタ get_a(), get_b(), get_c()は public の
// ままで継承されているので記述不要。
};
/* public派生(孫クラス) */
class Class32 : public Class31 {
public:
// void get_a() { cout << a << '\n'; } // エラー
void get_b() { cout << b << '\n'; }
void get_c() { cout << c << '\n'; }
// ゲッタ get_a(), get_b(), get_c()は public の
// ままで継承されているので記述不要。
};
int main() {
Class00 c00;
// cout << c00.a << '\n'; // エラー
// cout << c00.b << '\n'; // エラー
cout << c00.c << '\n'; // 30
Class11 c11;
// cout << c11.a << '\n'; // エラー
// cout << c11.b << '\n'; // エラー
// cout << c11.c << '\n'; // エラー
Class21 c21;
// cout << c21.a << '\n'; // エラー
// cout << c21.b << '\n'; // エラー
// cout << c21.c << '\n'; // エラー
Class31 c31;
// cout << c31.a << '\n'; // エラー
// cout << c31.b << '\n'; // エラー
cout << c31.c << '\n'; // 30
Class12 c12;
Class22 c22;
Class32 c32;
c00.get_a(); // 10
c00.get_b(); // 20
c00.get_c(); // 30
c11.get_b(); // 20
c11.get_c(); // 30
c21.get_b(); // 20
c21.get_c(); // 30
c22.get_b(); // 20
c22.get_c(); // 30
c31.get_b(); // 20
c31.get_c(); // 30
c32.get_b(); // 20
c32.get_c(); // 30
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7090208
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック