クラスは継承(相続、インヘリタンス)することができました。元のクラスを基底(基本)クラス、継承されたクラスを派生(導出)クラスといいました。 第10章を参照してみてください。
継承の仕方は
派生クラス:アクセスコントロール 基底クラス{...};
でした。最後にセミコロンを忘れやすいので注意してください。アクセスコントロールにはpublic, protected, privateがありました。
では、簡単なサンプルを考えてみます。
まず、Animalクラスがあります。このメンバには足の数と尾の有無を変数に持っています。また、showメンバ関数で足の数と尾の有無を表示します。
Animalクラスのコンストラクタが呼ばれると、ユーザーに足の数と尾の有無とを尋ねます。
さて、このAnimalクラスを継承してMammalクラスを作ります。 Mammalクラスには、体の色をメンバに持っています。
このコンストラクタが呼ばれると、ユーザーに色を尋ねます。 また、このクラスのメンバ関数にはAnimalクラスと同じ名前のshowメンバ関数が有ります。この関数で、足の数、尾の有無、体の色を表示させたいとします。
この場合、基底クラスのメンバ関数は派生クラスのメンバ関数に上書きされてしまいます。(関数のオーバーライド)
また、派生クラスからは基底クラスのprivateメンバは見えません。 そこで、派生クラスのshowメンバ関数の中から、基底クラスのshowメンバ関数を呼んで、その後、体の色を表示するようにします。
では、サンプルを見てみましょう。
// cl02.cpp
#include <iostream>
using namespace std;
class Animal {
int nLeg;
int nTail;
public:
Animal();
int show();
};
Animal::Animal()
{
cout << "足の本数--";
cin >> nLeg;
cout << "尾の数--";
cin >> nTail;
}
int Animal::show()
{
char szBuf[32];
if (nTail == 1)
strcpy(szBuf, "尾があります");
else
strcpy(szBuf, "尾はありません");
cout << "足の数は" << nLeg << "本です" << endl;
cout << szBuf << endl;
return 0;
}
class Mammal : public Animal {
char szColor[16];
public:
Mammal();
int show();
};
Mammal::Mammal()
{
cout << "色は--";
cin >> szColor;
}
int Mammal::show()
{
Animal::show();
cout << "色は" << szColor << "です" << endl;
return 0;
}
int main()
{
Mammal Cat;
Cat.show();
return 0;
}
実行結果は次のようになります。
今回は、クラスの継承と関数のオーバーライドについて大急ぎで復習をしました。
Update Sep/28/2003 By Y.Kumei