前回のオーバーライドで、基底クラスのメンバ関数と派生クラスのメンバ関数が同じ名前の場合は、格納されているポインタの型によって、呼ばれる関数が違った・・・。
基底クラスのポインタなら基底クラスのメンバ関数、派生クラスのポインタなら派生クラスのメンバ関数・・・。
基底クラスのメンバ関数を仮想関数にすることで、ポインタの参照先の実体が元々何クラスのオブジェクトなのかを実行時にチェックし、そのクラスのメンバ関数を呼ぶようにできる・・・。
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