第10章 クラスのインヘリタンス


インヘリタンス(inheritance)とは、「相続」「継承」 「相続財産」「継承物」などという意味の英語です。 C++では、クラスを継承(相続)する事ができます。 クラスを継承するには、次のように書きます。

導出クラス:アクセスコントロール 基本クラス {...};

導出クラスとは、継承先のクラス(新しく作るクラス) 基本クラスとは継承元のクラス(元になるクラス)のことです。 参考書により用語はいろいろあります。 ここで注意しなくてはいけないのが アクセスコントロールです。ここには、public, private, protected のいずれかが来ます。ここのところで

1.publicを指定すると継承元がprotectedなら、継承先もprotected 継承元がpublicなら、継承先もpublic 2.privateを指定すると継承元がprotectedなら、継承先はprivate 継承元がpublicなら、継承先はprivate 3.protectedを指定すると継承元がprotectedなら、継承先はprotected 継承元がpublicなら、継承先はprotected 4.継承元がprivateであれば継承先からはアクセスできない

となります。ここで、protectedというアクセスコントロールが出できましたが これは、クラス内のメンバ関数か、継承先のメンバ関数からかしかアクセスできない という意味です。継承先のクラスには、継承元のクラスのメンバがそっくり含まれます。 それに加えて、継承先でメンバを新しく加えることができます。privateとprotectedは 似ていて、紛らわしいのですが、次のような異同があります。

privateもprotectedもクラス内からは、アクセスできる。 privateもprotectedも特別な場合をのぞいてクラス外からはアクセスできない。 privateは継承先からはアクセスできないが、protectedならできる。

では、サンプルを作ってみましょう。継承元のクラスAをpublic で継承しています。それぞれどのようにアクセスできて、 どれがアクセスできないが確認してみましょう。 また、継承を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; }


クラス内、クラス外、継承先クラスでどれがアクセスでき どれがアクセスできないかがわかったでしょうか。 紛らわしいので、表でも作って覚えてください。 (暗記する必要はありません。必要時にその表を見てください)


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/11/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。