當函數名被呼叫時,編譯器將選擇應該執行的程式碼,此時即稱編譯器系結了函數名。換句話說,當函數被呼叫時,編譯器就會將該該函數的名稱和它的定義係結在一起。
靜態系結發生在編譯時,並將名稱係結到一個固定的函數定義,然後在每次呼叫該名稱時執行該定義。例如,編譯器使用靜態系結將以下語句中的 getName 係結到 Person 類(而不是其他類)中的 getName 定義:
for (int k = 0; k <people.size (); k++)
{
cout << people [k] ->getName () << endl;
}
在靜態系結中,編譯器使用編譯時可用的型別資訊。如果程式碼在繼承層次結構中的不同類的物件上執行,則編譯器可用的唯一型別資訊將是用於存取所有物件的基礎類別指標型別。因此,靜態系結將始終使用基礎類別版本的成員函數。
相反,動態系結發生在執行時。動態系結僅在編譯器可以確定執行時子類物件所屬的確切類時才起作用。編譯器然後使用這個執行時型別資訊來呼叫該類中定義的函數版本。
為了使動態系結成為可能,編譯器將執行時型別資訊儲存在具有虛擬函式的類的每個物件中。動態系結始終使用物件的實際類中的成員函數版本,而無視用於存取物件的指標的類。