前回の継承では、基底クラスclass_profileのoutputと派生クラスlass_detailのoutput_detailは名前の通り敢えて別々にしていた・・・。同じだとどうなるのだろうか・・・?
基底クラスと同じ名前(同じ引数の数、引数型)のメンバ関数を派生クラスに定義すると、メンバ関数はそちらの動作に再定義される・・・。これをオーバーライドという・・・。
class_detailの一斉出力メンバ関数を同じoutputにしてみる・・・。
クラス定義は、
とし、メンバ関数定義は、
とした・・・。
outputだと、名前が同じなので、
基底クラスのメソッドを呼ぶように、"class_profil::"をつけている・・・。
このように、クラス名でどちらを呼ぶかを指定できる・・・。
では、派生クラスのオブジェクトをnewで生成し、その派生オブジェクトポインタを基底クラスのポインタにキャストしたらどうなるだろうか・・・?
とポインタにして、
newで生成し、ポインタをdetに格納・・・。
値のセットが終わった後、
class_profileのポインタprofにdetを代入する・・・。(アップキャストなので暗黙的にキャストされる。)
でdetはoutputで出力・・・。
そのあとprofもoutputで出力・・・。
実行すると、
$ ./override name: Taro age: 20 address: Tokyo phonenumber: 1234 sex(0: none, 1: male, 2: female): 1 height: 160 weight: 45 name_ = Taro age_ = 20 address_ = Tokyo phonenumber_ = 1234 sex_ = MALE height_ = 160 weight_ = 45 name_ = Taro age_ = 20 address_ = Tokyo $
detはclass_detailのoutputが呼ばれていて、全部出力されている・・・。
profはclass_profileのoutputのせいか、3項目だけ・・・。
ポインタが指すインスタンスは同じだが、ポインタの型によって呼ばれるメンバ関数が違う・・・。