iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
自我挑戰組

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

Day26

在強行別語言中我們必須先定義變數的型別,例如vector a(10); 一個int向量只能放int元素否則會出現錯誤,不像python的list可以隨便放,但如果每個元素都繼承同一個父類別就可以使用如同昨天所說的vector < Employee * > employees( 4 )將子類別SalariedEmployee, HourlyEmployee, CommissionEmployee與孫類別BasePlusCommissionEmployee都丟進同一個向量。

說道多型一定要講這個老掉牙的解釋,動物會發出聲音如貓會喵喵叫狗會汪汪叫鴨子會呱呱叫,貓咪狗狗鴨子都是動物而且它們有不同的聲音,所以我們創造一個父類別Animal但並不實作say()方法,等到貓咪繼承時在去實作喵喵叫方法,狗狗與鴨子同理這就是多型。每一個人的解釋都是Animal跟Hello World同等級的存在。 在Animal的類別中我們可以將一些共同的特性實作在父類別如每個動物都要呼吸都要睡覺都有所屬的界門綱目科屬種,並將一些特殊特性在父類別進行抽象化,等到子類別時才進行實作。

螞蟻書在這邊提出一個好玩的觀點父類別可以丟給子類別指標,但子類別卻無法丟給父類別的指標,用CommissionEmployee(父)與BasePlusCommissionEmployee(子)來說一但可以將子類別地址丟給父類別指標,那等於讓CommissionEmployee(父)也得到setBaseSalary()方法,問題CommissionEmployee(父)在創建記憶體空間時並沒有留下給setBaseSalary()方法的空間,導致記憶體複寫到其他物件。所以出現禁止這種反向繼承的規則。為避免上述問題例如下例子類別指標指向父類別是不被允許的,然而父類別指標可以指向子類別物件這就是向下轉型(down casting)。

// Fig. 13.6: fig13_06.cpp
// Aiming a derived-class pointer at a base-class object.
#include "CommissionEmployee.h"
#include "BasePlusCommissionEmployee.h"

int main()
{
   CommissionEmployee commissionEmployee( 
      "Sue", "Jones", "222-22-2222", 10000, .06 );
   BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0;

   // aim derived-class pointer at base-class object
   // Error: a CommissionEmployee is not a BasePlusCommissionEmployee
   basePlusCommissionEmployeePtr = &commissionEmployee;
   return 0;
} // end main



上一篇
Day25
下一篇
Day27
系列文
少年DevOps的C++奇怪漂流30

尚未有邦友留言

立即登入留言