C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!
C++における「ポリモーフィズム(Polymorphism)」は、オブジェクト指向プログラミングの3大要素のひとつです。
日本語では「多態性」と呼ばれ、同じ操作で異なる動作を実現する機能を意味します。
この記事では、ポリモーフィズムの基本概念と使い方、仮想関数との関係を初心者向けにやさしく解説します。
ポリモーフィズムとは?
ポリモーフィズム(多態性)とは、同じ名前の関数を使っても、呼び出される実装が状況によって変わる仕組みです。
つまり、「同じインターフェースで異なる振る舞いを実現する」ことができます。
ポリモーフィズムを実現するには?
C++では、ポリモーフィズムを実現するために 仮想関数(virtual) を使います。
親クラスに virtual 関数を定義し、子クラスでその関数をオーバーライドすることで、動的に処理を切り替えられます。
基本構文と例
#include <iostream>
using namespace std;
// 親クラス
class Animal {
public:
virtual void speak() {
cout << "動物が鳴きます。" << endl;
}
};
// 子クラス(オーバーライド)
class Dog : public Animal {
public:
void speak() override {
cout << "ワンワン!" << endl;
}
};
class Cat : public Animal {
public:
void speak() override {
cout << "ニャーニャー!" << endl;
}
};
int main() {
Animal* animal; // ポインタを使うのがポイント
Dog dog;
Cat cat;
animal = &dog;
animal->speak(); // ワンワン!
animal = &cat;
animal->speak(); // ニャーニャー!
return 0;
}
このように、親クラス型のポインタで子クラスのメソッドを動的に呼び分けることができます。
静的バインディングと動的バインディング
- 静的バインディング: コンパイル時に関数が決まる(通常の関数)
- 動的バインディング: 実行時に関数が決まる(virtual関数)
ポリモーフィズムは動的バインディングを使って、より柔軟で拡張性の高い設計を可能にします。
ポリモーフィズムのメリット
- 拡張性が高い
新しい子クラスを追加しても、既存コードに影響を与えずに機能を拡張できます。
- 保守性が向上
同じ関数名で複数の動作が定義できるため、コードが整理されます。
- 共通インターフェースの利用
異なるクラスを一つの型で扱えるため、汎用的なプログラムが書けます。
注意点
- 仮想関数を使う場合は、必ず
virtual
を親クラスに明記すること
- デストラクタも仮想化するのが安全(
virtual ~ClassName()
)
まとめ
C++におけるポリモーフィズムは、継承と仮想関数を活用して、柔軟で保守性の高いプログラムを実現する仕組みです。
実行時に呼び出す関数を切り替えることで、拡張性のある設計が可能になります。
まずは仮想関数とポインタの使い方をマスターし、オブジェクト指向の本質を体験してみましょう!