2017年12月17日
《その183》 仮想関数(1)
仮想関数
下のプログラムは、仮想関数の働きを見るためのものです。
プログラム中の◆◆◆印の部分が仮想関数ですが、このプログラムでは、その部分をコメントアウトしてあります。
次回《184》にコメントアウトを外して、その働きを見てみることになります。
プログラム中に、2種類のクラスがあります。違いは次の2点です。
(1) クラス Member
・データメンバ : 番号 ・自己ベスト
・関数 print は、
番号, 自己ベスト を出力
(2) public派生クラス Member2
・データメンバ : 番号 ・自己ベスト ・性別
・関数 print は、
番号, 性別, 自己ベスト を出力
各オブジェクトを、
Member* ptr[] = { &harada, &tahara, &kawada, &tagawa };
のように、基底クラス型のポインタ ptr[0] 〜 ptr[3] で、指している点に注意してください。
末尾に載せてある出力結果を見ると、番号, 自己ベストだけが出力されています。
このことから、4人分のオブジェクトが全て Member型として扱われたことが分かります。
// ------------------------------------
#include <string>
#include <iostream>
using namespace std;
class Member {
public:
int number; // 番号
double best_time; // 自己ベスト
Member(int n, double t)
: number(n), best_time(t) { }
// 個人データの出力
// virtual void print() const { // ◆◆◆
void print() const {
cout << "【" << number << "】"
"自己ベスト : "
<< best_time << '\n';
}
};
class Member2 : public Member {
public:
char mf; // 性別
Member2(int n, double t, char c)
: Member(n, t), mf(c) { }
// 個人データの出力
void print() const {
cout << "【" << number << "】"
"性別 (" << mf << ") "
"自己ベスト : "
<< best_time << '\n';
}
};
int main() {
// Member型オブジェクトの生成
Member harada(1001, 13.2);
Member tahara(2001, 12.2);
// Member2型オブジェクトの生成
Member2 kawada(3002, 11.8, 'm');
Member2 tagawa(3006, 12.2, 'f');
Member* ptr[] = { &harada, &tahara, &kawada, &tagawa };
for (int i = 0; i < sizeof(ptr) / sizeof(ptr[0]); i++)
(*ptr[i]).print();
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7100733
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック