オーバーライドとは
オーバーライド(override)は、C++の重要な概念で、基底クラス(親クラス)で定義されたメソッドを派生クラス(子クラス)で再定義することを指します。これにより、同じメソッド名でも、そのクラスの型によって異なる動作をすることが可能になります。
オーバーライドは、オブジェクト指向プログラミングの中心的な特性である「ポリモーフィズム(多態性)」を実現します。これにより、プログラムの柔軟性と再利用性が向上します。
具体的には、基底クラスのメソッドをvirtual
キーワードを使って宣言し、派生クラスではそのメソッドを再定義します。このとき、派生クラスのメソッドは基底クラスのメソッドを「オーバーライド」していると言います。
次のセクションでは、オーバーライドの具体的な実装例を見ていきましょう。
オーバーライドの実装例
C++におけるオーバーライドの一例を以下に示します。ここでは、Animal
という基底クラスを定義し、その中にvirtual
キーワードを使ってsound
というメソッドを定義します。そして、Dog
とCat
という2つの派生クラスを作り、それぞれでsound
メソッドをオーバーライドします。
#include <iostream>
// 基底クラス
class Animal {
public:
virtual void sound() {
std::cout << "This is an animal sound." << std::endl;
}
};
// 派生クラス1
class Dog : public Animal {
public:
void sound() override {
std::cout << "Woof!" << std::endl;
}
};
// 派生クラス2
class Cat : public Animal {
public:
void sound() override {
std::cout << "Meow!" << std::endl;
}
};
int main() {
Dog dog;
Cat cat;
dog.sound(); // Woof!
cat.sound(); // Meow!
return 0;
}
このコードを実行すると、Dog
クラスのインスタンスdog
のsound
メソッドは「Woof!」を、Cat
クラスのインスタンスcat
のsound
メソッドは「Meow!」を出力します。これは、それぞれのクラスでsound
メソッドがオーバーライドされているためです。
次のセクションでは、オーバーライドの利点と注意点について説明します。
オーバーライドの利点と注意点
利点
-
多態性の実現: オーバーライドは、オブジェクト指向プログラミングの中心的な特性である「ポリモーフィズム(多態性)」を実現します。これにより、同じメソッド名でも、そのクラスの型によって異なる動作をすることが可能になります。
-
コードの再利用: オーバーライドを利用すると、基底クラスのメソッドを派生クラスで再利用することができます。これにより、コードの重複を避けることができ、プログラムの保守性が向上します。
-
拡張性の向上: 新しいクラスを追加する際に、基底クラスのメソッドをオーバーライドすることで、新しい機能を追加することが容易になります。
注意点
-
virtual
キーワードの使用: C++では、基底クラスのメソッドをオーバーライドするためには、そのメソッドをvirtual
キーワードを使って宣言する必要があります。virtual
キーワードがない場合、派生クラスで同名のメソッドを定義しても、それは新たなメソッドとなり、オーバーライドは行われません。 -
override
キーワードの使用: C++11以降では、派生クラスのメソッドをoverride
キーワードを使って宣言することが推奨されています。これにより、コンパイラがオーバーライドの正しさをチェックしてくれます。override
キーワードがない場合、基底クラスのメソッドのシグネチャ(名前、引数の型と数、戻り値の型)と一致しない場合でも、エラーが発生せず、意図しない動作を引き起こす可能性があります。
以上が、C++のオーバーライドの利点と注意点です。これらを理解し、適切に利用することで、効率的で保守性の高いコードを書くことができます。次のセクションでは、さらに詳しくオーバーライドの使用例を見ていきましょう。