読者です 読者をやめる 読者になる 読者になる

オーバーライド

前回の継承では、基底クラス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項目だけ・・・。
ポインタが指すインスタンスは同じだが、ポインタの型によって呼ばれるメンバ関数が違う・・・。

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