雖然有向下轉型但透過指標呼叫方法時到底會呼叫到父類別的方法還是子類別的方法呢?來講一個很容易弄錯的地方,由於子類別類直接繼承父類別的成員方法,這時想要重載父類別的方法就需要關鍵字virtual。還是直接看程式碼進行比較父類別CommissionEmployee與子類別BasePlusCommissionEmployee。
// Fig. 13.5: fig13_05.cpp
int main()
{
// ....省略若干程式碼
commissionEmployeePtr = &basePlusCommissionEmployee;
cout << "\n\n\nCalling print with base-class pointer to "
<< "derived-class object\ninvokes base-class print "
<< "function on that derived-class object:\n\n";
commissionEmployeePtr->print(); // invokes base-class print
cout << endl;
return 0;
}
//Result
Calling print with base-class pointer to derived-class object
invokes base-class print function on that derived-class object:
commission employee: Bob Lewis
social security number: 333-33-3333
gross sales: 5000.00
commission rate: 0.04
上面的例子顯示了一個重要的問題,透過父類別指標即使指向子類別記憶體地址也呼叫不到子類別的方法,這樣就無法實踐"多型"的概念,這時候就需要透過關鍵字 virtual讓編譯器能重新寫入(override),動態的連結到子類別的方法以實現多型的概念,有了virtual程式就可以根據物件實際型別而非指標型別來選擇正確的方法(Method),因為不是在編譯時就決定而是在執行期間動態決定所以又稱為dynamic binding或late binding。
其使用方式也很簡單在需要dynamic binding的方法前加上virtual關鍵字即可,virtual關鍵字具有強制繼承特性不管子類別的方法前有無virtual只要父類別有virtual子類別與孫類別的該方法都會強制轉換成virtual方法。