継承元の関数を継承先で書換えてしまうことをオーバーライドといいました。これは、第12章でやりました。 第12章では継承元でオーバーライドされる関数は仮想関数としてvirtualで宣言しました。仮想関数については、後の章でさらに詳しくやりますので、この章ではvirtualの宣言をしません。
単に、関数のオーバーライドの様子を観察して、さらにもともとの関数を呼び出す実験をします。
今回はSchoolクラスを作ってこれをClassクラスに継承します。
Schoolクラスには、クラスの名前を格納する配列をメンバに持っています。
また、クラスの数を格納する変数をメンバに持っています。
コンストラクタでクラス名をユーザーに入力させます。
showメンバ関数は、格納されているクラス名を表示します。
さて、ClassクラスはSchoolクラスより継承されたクラスです。
クラスに在籍している生徒の名前を格納する配列をメンバに持っています。
クラスの人数を格納する変数もメンバに持っています。
コンストラクタで生徒の名前を入力させます。
これは、Schoolクラスと同様にshowメンバ関数関数を持っています。
従ってSchoolクラスのshowメンバ関数はClassクラスのshowメンバ関数で上書きされます。 しかし、その学校のクラス名を表示させたいこともあると思われます。 この場合、
Class MyClass; MyClass.show();では、クラスの生徒名が表示されるだけですね。
そこで、スコープ解決演算子を使って
MyClass.School::show();とします。これで、その学校のクラスの名前が列挙されます。
なんだか、つまらないプログラムですが、いろいろ試してみてください。
// cl04.cpp
#include <iostream>
using namespace std;
class School {
char classnames[5][16];
int classno;
public:
School();
int show();
};
School::School()
{
int i;
for (i = 0; i < 5; i++) {
cout << "クラス名入力(endで終了)---";
cin >> classnames[i];
if (strcmp(classnames[i], "end") == 0) {
break;
}
}
classno = i;
}
int School::show()
{
int i;
cout << "クラスは全部で" << classno << "あります" << endl;
for (i = 0; i < classno; i++) {
cout << classnames[i] << endl;
}
return 0;
}
class Class : public School {
int studentno;
char studentnames[5][16];
public:
Class();
int show();
};
Class::Class()
{
int i;
for (i = 0; i < 5; i++) {
cout << "生徒名入力(endで終了)---";
cin >> studentnames[i];
if (strcmp(studentnames[i], "end") == 0) {
break;
}
}
studentno = i;
}
int Class::show()
{
int i;
cout << "生徒数は" << studentno << "人です" << endl;
for (i = 0; i < studentno; i++) {
cout << studentnames[i] << endl;
}
return 0;
}
int main()
{
Class MyClass;
MyClass.show();
MyClass.School::show();
return 0;
}
実行結果は、次のようになります。
Update Feb/01/2004 By Y.Kumei