iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
自我挑戰組

少年DevOps的C++奇怪漂流系列 第 27

Day27

雖然有向下轉型但透過指標呼叫方法時到底會呼叫到父類別的方法還是子類別的方法呢?來講一個很容易弄錯的地方,由於子類別類直接繼承父類別的成員方法,這時想要重載父類別的方法就需要關鍵字virtual。還是直接看程式碼進行比較父類別CommissionEmployee與子類別BasePlusCommissionEmployee。

  • 沒用virtual的情況
    如下fig13_05.cpp範例中將basePlusCommissionEmployee的記憶體位置透過&運算子丟給*commissionEmployeePtr指標,再透過指標呼叫print()方法,由於類別型態是commissionEmployee故C++編譯器會直接呼叫父類別的方法而非子類別的方法。
// 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的情況

上面的例子顯示了一個重要的問題,透過父類別指標即使指向子類別記憶體地址也呼叫不到子類別的方法,這樣就無法實踐"多型"的概念,這時候就需要透過關鍵字 virtual讓編譯器能重新寫入(override),動態的連結到子類別的方法以實現多型的概念,有了virtual程式就可以根據物件實際型別而非指標型別來選擇正確的方法(Method),因為不是在編譯時就決定而是在執行期間動態決定所以又稱為dynamic binding或late binding。

其使用方式也很簡單在需要dynamic binding的方法前加上virtual關鍵字即可,virtual關鍵字具有強制繼承特性不管子類別的方法前有無virtual只要父類別有virtual子類別與孫類別的該方法都會強制轉換成virtual方法。


上一篇
Day26
下一篇
Day28:錯誤處理
系列文
少年DevOps的C++奇怪漂流30

尚未有邦友留言

立即登入留言