C++関数オーバーライド完全解説:実例とベストプラクティス
C++関数オーバーライド完全解説
このガイドでは、C++の関数オーバーライドを明確な例、ベストプラクティス、ベテランC++開発者が本番で使うステップバイステップの解説で紐解きます。
なぜ関数オーバーライドが重要か
オブジェクト指向プログラミングにおいて、継承は派生クラスが基底クラスの振る舞いを拡張または変更することを可能にします。同じメンバ関数が基底クラスと派生クラスの両方で宣言されている場合、派生クラスの実装が基底クラスのものを「オーバーライド」します。その関数を派生クラスオブジェクト経由で呼び出すと、オーバーライドされたバージョンが実行されます。
例1: 基本的なオーバーライド
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived d;
d.print();
return 0;
}
出力
Derived Function
Derivedインスタンスでprint()を呼ぶと、基底版ではなくオーバーライドされた関数が実行されます。

Baseオブジェクトを作ってprint()を呼べば、元の基底実装が見られます。
Base b; b.print(); // 出力: Base Function
オーバーライドされた基底関数へのアクセス
基底クラスのバージョンを明示的に呼び出したい場合があります。よく使う2つの手法は:
- スコープ解決演算子
::を使う。 - 基底クラスポインタを派生オブジェクトに向ける(関数がvirtualでない場合)。
例2: スコープ解決演算子で基底関数を呼ぶ
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived d1, d2;
d1.print();
d2.Base::print(); // Base::printを明示的に呼び出し
return 0;
}
出力
Derived Function Base Function
例3: 派生クラス内から基底関数を呼ぶ
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
Base::print(); // 基底版を呼び出し
}
};
int main() {
Derived d;
d.print();
return 0;
}
出力
Derived Function Base Function
例4: 基底ポインタを使って基底関数にアクセス
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived d;
Base* ptr = &d; // 派生オブジェクトを指す基底ポインタ
ptr->print(); // 関数がvirtualでないためBase::printが呼ばれる
return 0;
}
出力
Base Function
関数がvirtualで宣言されていない場合、基底クラスポインタ経由の呼び出しは基底実装を呼び出します。真のポリモーフィックな振る舞いを得るには、基底関数をvirtualで宣言し、派生クラスでオーバーライドしてください。
これらの例はC++における関数オーバーライドの仕組みを示しています。これらの概念をマスターすることで、ポリモーフィズムを効果的に活用した、よりクリーンで保守しやすいコードが書けるようになります。
C言語
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
- C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
- C++関数を実例で徹底解説:基本から応用まで
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C++プログラミング言語:概要と主要機能
- C++定数とリテラル完全解説:型、構文、ベストプラクティス
- C++演算子完全ガイド:種類、使い方、ベストプラクティス
- C++数値型完全ガイド:実践的な使い方と数学関数
- C++オーバーロード完全マスター:関数と演算子のオーバーロード
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数