アフィリエイト広告を利用しています

広告

posted by fanblog

2017年12月17日

《その184》 仮想関数(2)


 仮想関数

 前回《183》のプログラムと今回のプログラムの相違点は、
基底クラス Member のメンバ関数の関数宣言 void print() const; の前に virtual を付加して、

  virtual void print() const;

としてある箇所( 印 )だけです。
これで、関数 print は仮想関数になります。

 派生クラスのメンバ関数で、基底クラスの仮想関数と仕様(関数名と仮引数)が同じものは、virtual が付加されていなくても仮想関数とみなされます。
したがって、Member2クラスのメンバ関数 print も仮想関数です。

 プログラムコードより実行結果が先になってしまいますが、実行結果は次のようになります。
上が前回《183》の実行結果、下が今回(メンバ関数 print が仮想関数)の実行結果です。

【 前回《183》の実行結果 】
f05_000207.png

【 今回の実行結果 】
f05_000307.png


 今回のプログラムは、関数 print が仮想関数になっている点が、前回と違っています。
仮想関数は、x.print() として呼ばれたときに、x の静的な型ではなく、動的な型のメンバ関数を呼び出します。
 動的な型とは、ポインタが指しているオブジェクトの実際の型であり、
  harada, tahara であれば Member型、
  kawada, tagawa であれば Member2型
ということになります。

 その結果、x.print により、
  harada, tahara では、Member::print()、
  kawada, tagawa では、Member2::print()、
が実行されることになります。

以下が今回のプログラムです。

// ------------------------------------
#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();
}
// ------------------------------------





新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7101594
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。