動的結合

『Accelerated C++』より

virtual関数にすることで、参照/ポインタの指すオブジェクトの実際の型を見て、正しいバージョンの関数が呼ばれる。

virtualな関数(仮想関数)の実行時の選択は、参照かポインタを通して関数が呼ばれるときだけに行われる。仮想関数であっても、オブジェクトに対して実行されるなら、その型はコンパイル時に決まり実行時に変わることは無い。一方、参照やポインタは基底クラスでも派生クラスでも指すことができ、したがって、それらの指すオブジェクトの型は実行時に決められる。

コンパイル時に呼び出される関数が決められていることを、静的結合(statically bound)という。参照やポインタを使う関数呼び出しの場合は動的結合(dynamic binding)と呼ばれる。

静的結合という言葉が「呼び出す関数がコンパイル時に決められる」を意味する野に対し、動的結合という言葉は「関数の呼び出しが実行時に決められる」という意味です。仮想関数であっても、オブジェクトに対して呼び出すなら、その呼び出しは静的結合です。そのオブジェクトがコンパイル時と実行時に異なる型になることはないからです。一方、ポインタや参照に対しては、仮想関数は、実行時に内容が決められる、動的結合になります。仮想関数は、参照やポインタが実行時に指す型によって、異なるバージョンのものが決められるのです。