導出クラスとは、継承先のクラス(新しく作るクラス) 基本クラスとは継承元のクラス(元になるクラス)のことです。 参考書により用語はいろいろあります。 ここで注意しなくてはいけないのが アクセスコントロールです。ここには、public, private, protected のいずれかが来ます。ここのところで導出クラス:アクセスコントロール 基本クラス {...};
となります。ここで、protectedというアクセスコントロールが出できましたが これは、クラス内のメンバ関数か、継承先のメンバ関数からかしかアクセスできない という意味です。継承先のクラスには、継承元のクラスのメンバがそっくり含まれます。 それに加えて、継承先でメンバを新しく加えることができます。privateとprotectedは 似ていて、紛らわしいのですが、次のような異同があります。1.publicを指定すると継承元がprotectedなら、継承先もprotected 継承元がpublicなら、継承先もpublic 2.privateを指定すると継承元がprotectedなら、継承先はprivate 継承元がpublicなら、継承先はprivate 3.protectedを指定すると継承元がprotectedなら、継承先はprotected 継承元がpublicなら、継承先はprotected 4.継承元がprivateであれば継承先からはアクセスできない
では、サンプルを作ってみましょう。継承元のクラスAをpublic で継承しています。それぞれどのようにアクセスできて、 どれがアクセスできないが確認してみましょう。 また、継承をprivateやprotectedで行って確認してみてください。privateもprotectedもクラス内からは、アクセスできる。 privateもprotectedも特別な場合をのぞいてクラス外からはアクセスできない。 privateは継承先からはアクセスできないが、protectedならできる。
#include <iostream.h> class A{ private: int a; protected: int b; public: int c; A(); ~A(){}; void show(); }; A :: A() { a = 1; b = 2; c = 3; } void A::show(void) { cout << "a= " << a << '\n'; cout << "b= " << b << '\n'; cout << "c= " << c << '\n'; cout << '\n'; return; } class B:public A{ int d; protected: int e; public: int f; B(); ~B(){}; int showB(); }; B::B() { d = 4, e = 5, f = 6; } int B::showB(void) { //エラー //cout << "a= " << a << '\n'; クラスAのprivateにアクセスできません cout << "b= " << b << '\n'; cout << "c= " << c << '\n'; cout << "d= " << d << '\n'; cout << "e= " << e << '\n'; cout << "f= " << f << '\n'; cout << '\n'; return 0; } int main(void) { A test1; B test2; test1.show(); test2.showB(); //cout << "A.a= " << test1.a << '\n'; エラー!privateメンバにはアクセスできません //cout << "A.b= " << test1.b << '\n'; protectedメンバにはアクセスできませ cout << "A.c= " << test1.c << '\n'; //cout << "B.a= " << test2.a << '\n'; エラー! //cout << "B.b= " << test2.b << '\n'; エラー! cout << "B.c= " << test2.c << '\n'; //cout << "B.d= " << test2.d << '\n'; エラー! //cout << "B.e= " << test2.e << '\n'; エラー! cout << "B.f= " << test2.f << '\n'; cout << '\n'; return 0; }
クラス内、クラス外、継承先クラスでどれがアクセスでき
どれがアクセスできないかがわかったでしょうか。
紛らわしいので、表でも作って覚えてください。
(暗記する必要はありません。必要時にその表を見てください)
Update Jan/11/1997 By Y.Kumei