仮想関数

前回のオーバーライドで、基底クラスのメンバ関数と派生クラスのメンバ関数が同じ名前の場合は、格納されているポインタの型によって、呼ばれる関数が違った・・・。
基底クラスのポインタなら基底クラスのメンバ関数、派生クラスのポインタなら派生クラスのメンバ関数・・・。

基底クラスのメンバ関数を仮想関数にすることで、ポインタの参照先の実体が元々何クラスのオブジェクトなのかを実行時にチェックし、そのクラスのメンバ関数を呼ぶようにできる・・・。

class_profileのoutputを仮想関数にするには、

virtualを付けるだけ・・・。

あとは、

class_profileのオブジェクトprof2を新たに追加・・・。

profはdetを代入してもらうのに対して、prof2は新たなclass_profileオブジェクトのポインタをもつ・・・。

profの実体はdetなので、class_detailのoutputが呼ばれる・・・。

prof2の実体は、class_profileの新しいオブジェクトなので、class_profileのoutputが呼ばれる・・・。

実行すると、

$ ./virtual_function
name: Taro
age: 20
address: Tokyo
phonenumber: 1111
sex(0: none, 1: male, 2: female): 1
height: 160
weight: 50
name_ = Taro
age_ = 20
address_ = Tokyo
phonenumber_ = 1111
sex_ = MALE
height_ = 160
weight_ = 50

name_ = Taro
age_ = 20
address_ = Tokyo
phonenumber_ = 1111
sex_ = MALE
height_ = 160
weight_ = 50

name_ = Taro
age_ = 20
address_ = Tokyo
$

det, prof, prof2と出力しているが、profの実体のクラスがclass_detailなので7項目出力している・・・。
prof2はclass_profileのオブジェクトなので3項目・・・。

Sample/virtual_function.cpp at master · bg1bgst333/Sample · GitHub