●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

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関数)

ポリモーフィズムは動的バインディングを使って、より柔軟で拡張性の高い設計を可能にします。

ポリモーフィズムのメリット

  1. 拡張性が高い
    新しい子クラスを追加しても、既存コードに影響を与えずに機能を拡張できます。
  2. 保守性が向上
    同じ関数名で複数の動作が定義できるため、コードが整理されます。
  3. 共通インターフェースの利用
    異なるクラスを一つの型で扱えるため、汎用的なプログラムが書けます。

注意点

  • 仮想関数を使う場合は、必ず virtual を親クラスに明記すること
  • デストラクタも仮想化するのが安全(virtual ~ClassName()

まとめ

C++におけるポリモーフィズムは、継承と仮想関数を活用して、柔軟で保守性の高いプログラムを実現する仕組みです。 実行時に呼び出す関数を切り替えることで、拡張性のある設計が可能になります。

まずは仮想関数とポインタの使い方をマスターし、オブジェクト指向の本質を体験してみましょう!

 

C++関連用語集

−−−−−  C++  −−−−−

C++のクラス(Class)とは?仕組みと使い方をわかりやすく解説!

C++のオブジェクト(Object)とは?クラスとの関係と役割をわかりやすく解説!

C++のコンストラクタ(Constructor)とは?役割と使い方をやさしく解説!

C++のデストラクタ(Destructor)とは?役割と使い方をやさしく解説!

C++の継承(Inheritance)とは?クラスを拡張する基本テクニック

C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!

C++のオーバーロード(Overload)とは?関数や演算子を便利に使い分けよう!

C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方

C++の仮想関数(Virtual Function)とは?ポリモーフィズムを実現する仕組みを解説!

C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!

C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++の名前空間(Namespace)とは?名前の衝突を防ぐ便利な機能

C++の標準テンプレートライブラリ(STL)とは?効率的な開発に必須のライブラリ群

C++のベクター(vector)とは?配列より便利なSTLコンテナを使いこなそう!

C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵

C++の参照(Reference)とは?ポインタとの違いもわかりやすく解説!

C++のポインタ(Pointer)とは?メモリを操る強力な機能をやさしく解説!

C++の動的メモリ確保(Dynamic Memory Allocation)とは?newとdeleteを使いこなそう

C++のnew/delete演算子とは?動的メモリ確保の基本をマスターしよう!

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

C++のtry/catch構文とは?例外処理の基本をやさしく解説!

C++のRAIIとは?リソース管理を自動化する重要な設計原則

C++の静的変数(static variable)とは?使い方・特徴・注意点をやさしく解説!

C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!

C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++のコンパイル(Compile)とは?仕組みと流れをわかりやすく解説!

C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!

C++のプリプロセッサディレクティブとは?#include や #define の意味と使い方