継承 その2
継承のつづき。メソッドとコンストラクタのオーバーライドについて。
メソッドのオーバーライド
普通にできます。特に書くことなし。オーバーライドした親クラスのメソッドを呼び出すには「<親クラス名>::」をつけます。Javaの「super.」のようもの。
#include <iostream> // 親クラス class Animal { protected : // protected またはpublicとすること。 void run(); }; void Animal::run() { std::cout << "animal run." << std::endl; } // 派生クラス class Kitten : public Animal { public : // オーバーライドする場合もプロトタイプ宣言は必要。 void run(); }; // オーバーライドされた関数 void Kitten::run() { // 親クラスのメソッド呼び出し // 「親クラス名::」をつける。 Animal::run(); std::cout << "kitten run." << std::endl; } // メイン関数 int main() { Kitten kitten; kitten.run(); return 0; }
実行結果です。
animal run. kitten run.
親クラスのコンストラクタの呼び出し
Javaと同じく、派生クラスの生成時には親クラスのコンストラクタを実行する必要があります。
- 親クラスで引数なしのデフォルトコンストラクタが定義されている場合、暗黙的にこれが実行されます。(Javaと同じ)
- 引数ありのコンストラクタを実行したい場合、派生クラスのコンストラクタに「: <親クラスのコンストラクタ>(<引数..>)」を追加します。
- javaのように「super(<引数>);」で実行できたりはしません。
#include <iostream> // 親クラス class Animal { public : Animal( ); Animal( char* name ); }; // 親クラスのコンストラクタ。引数を持つ Animal::Animal(char* name) { std::cout << "animal " << name << " created." << std::endl; } // 親クラスのデフォルトコンストラクタ Animal::Animal() { std::cout << "animal created." << std::endl; } // 派生クラス class Kitten : public Animal { public : Kitten( ); Kitten( char* name ); }; // 派生クラスのコンストラクタ Kitten::Kitten( char* name ) : Animal( name ) { // 親クラスの引数つきコンストラクタを実行する設定 std::cout << "kitten " << name << " created." << std::endl; } // 派生クラスのデフォルトコンストラクタ Kitten::Kitten() { std::cout << "kitten created." << std::endl; } // メイン関数 int main() { Kitten kitten; Kitten kitten2( "mii" ); return 0; }
実行結果です。
animal created. kitten created. animal mii created. kitten mii created.