T.TAO
Back to Blog
/3 min read/Blog

C++ Programming #8 Polymorphism

C++ Programming #8 Polymorphism

C++プログラミング #8 ポリモーフィズム

  • Lingheng Tao
  • 2025年1月1日
  • 読了時間 3 分

C++ Programming Content List C++ Programming #5 Functions

#GameEngine#ComputerScience#SWE

このノートは C++ OOP のポリモーフィズム(polymorphism)について。ポリモーフィズムは OOP の核心特性の一つで、同じインターフェースで異なる実装を指す。C++ では、基底クラスのポインタや参照を通じて派生クラスの関数を呼び出せる。

ポリモーフィズムには二つの形式がある:

  • 静的ポリモーフィズム(コンパイル時):関数オーバーロードとテンプレートで実現。
  • 動的ポリモーフィズム(実行時):虚関数と継承で実現。

動的ポリモーフィズム

虚関数

虚関数(virtual function)は、実行時にオブジェクトの実際の型に応じて呼び出す関数を決定するメンバ関数。基底クラスで virtual でマークし、派生クラスで override でオーバーライド。動的バインディングを実現。

虚表(VTable)

虚表は虚関数を含むクラスごとに生成されるデータ構造。虚関数のアドレスを格納。各オブジェクトは隠れたポインタ(vptr)で自クラスの虚表を指す。虚関数呼び出し時、vptr で虚表を参照し関数アドレスを取得して実行。

虚デストラクタ

基底クラスがポインタで派生クラスオブジェクトを解放する場合、基底クラスのデストラクタを虚関数にしなければならない。さもなければリソースリークを引き起こす。虚デストラクタ呼び出し時、派生クラスのデストラクタが先に、次に基底クラスのデストラクタが呼ばれる。

コンストラクタ

コンストラクタは虚関数にできない。コンストラクタ内で虚関数を呼んでも、派生クラスのオーバーライド版は呼ばれず、現在のクラスで定義された版が呼ばれる(コンパイル時バインディング)。基底クラスコンストラクタ実行時、派生クラスはまだ完全に構築されておらず、虚表も未確立のため。

静的ポリモーフィズム

関数オーバーロードとテンプレートにより、コンパイル時に解決される。