C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方
C++のクラス設計において、継承を使うと親クラスの関数を子クラスで書き換えることができます。
この機能をオーバーライド(Override)と呼びます。
この記事では、C++のオーバーライドの基本的な仕組みと使い方、オーバーロードとの違いや注意点について初心者向けにやさしく解説します。
オーバーライドとは?
オーバーライド(Override)とは、親クラスで定義された仮想関数を、子クラスで同じ名前・同じ引数で再定義することです。
オーバーライドすることで、子クラス独自の動作を上書きして実行できます。
オーバーライドの基本構文
class 親クラス {
public:
virtual void 関数名();
};
class 子クラス : public 親クラス {
public:
void 関数名() override;
};
オーバーライドする関数には、C++11以降では override
キーワードを明記するのが推奨されます。
これにより、オーバーライドが正しく行われているかコンパイラがチェックしてくれます。
オーバーライドの例
#include <iostream>
using namespace std;
// 親クラス
class Animal {
public:
virtual void speak() {
cout << "動物が鳴いています。" << endl;
}
};
// 子クラス(オーバーライド)
class Dog : public Animal {
public:
void speak() override {
cout << "ワンワン!" << endl;
}
};
int main() {
Animal* animal = new Dog();
animal->speak(); // ワンワン!(子クラスの関数が呼ばれる)
delete animal;
return 0;
}
この例では、Animal
クラスの仮想関数 speak()
を Dog
クラスがオーバーライドしています。
親クラスのポインタを使っても、実際には子クラスの関数が呼ばれるのがポイントです。
オーバーロードとの違い
項目 | オーバーロード | オーバーライド |
意味 | 同じ関数名で引数が違う | 親クラスの関数を子クラスで再定義 |
関係 | 同じクラス内で複数定義 | 親子クラス間で再定義 |
キーワード | なし | virtual , override |
オーバーライドのメリット
- 柔軟な拡張が可能
親クラスを変更せずに、子クラスで新しい動作を定義できます。
- 多態性を実現
ポリモーフィズムにより、親型ポインタで子の動作を呼び出せます。
- 統一的なインターフェース
関数名を統一できるのでコードがシンプルになります。
注意点
- 親クラス側の関数は
virtual
を付ける必要があります。
- 子クラスでオーバーライドする際は、C++11以降では
override
を使うと安全です。
- 関数のシグネチャ(引数の型と数)が完全に一致していないとオーバーライドになりません。
まとめ
C++のオーバーライドは、仮想関数を使って親クラスの処理を子クラスで上書きする仕組みです。
継承と組み合わせることで、柔軟で拡張性のあるプログラムを実現できます。
オーバーロードとの違いをしっかり理解し、virtual
とoverride
の正しい使い方を覚えておくことが、オブジェクト指向を深く理解する第一歩です。