iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

C++超級菜鳥也可以懂的物件導向攻略系列 第 20

Day 20 C++ 物件導向6 - 繼承 Inheritance

  • 分享至 

  • xImage
  •  

當我們要做出兩個很類似的class時,可以讓第二個class承繼一些原本class的參數與設定,不用再重複打一次,一樣是省時間省眼睛的懶人福音。

為了簡單稱呼,把第一個、原型叫做Super class,第二個叫做Sub class。
比方說:電腦class,下面有桌機class、筆電class。電腦就是Super class,筆電跟桌機叫做Sub class。

或是用擬人化稱呼,阿公、媽媽、小孩


先來複習一下之前提到class有三個區域:

  • private: 私人區域,只有該class可以取用
  • protected: 保護只有繼承可以取用
  • public: 完全公開,哪裡都可以取用

繼承也有三種模式:
私人模式、保護模式、公開模式。

這邊使用外公生媽媽,媽媽生小孩來做舉例。

  • Private mode: 如果媽媽是私人模式,小孩繼承的public和protected都會變成"private"。
  • Protected mode: 如果是媽媽是proctected mode,那小孩從媽媽那邊繼承的public跟protected都會變成protected。
  • Public mode: 當媽媽是publica模式時,小孩繼承的public延續成為public,protected也是protected。

注意:private區域的東西是只能在class內取用,因此繼承時也不能繼承到

基本繼承法

以下示範外公生下lapto媽媽,然後。

class Computer{
    .....
};
class Laptop: public Computer{
    ......
};

三代同堂繼承法

以下示範
注:MBP的後代,曾孫就會變成“全部都是private",因為MBP是private。

class Computer{
    .....
};
class Laptop: public Computer{
    ......
};
class MBP: private Laptop{
    ......
};

繼承兩個方法

除了上面舉例直系的繼承(小孩媽媽的爸爸是外公,這樣就是直系),也可以繼承雙親的基因,例如同時繼承爸爸Computer跟媽媽Apple的數值,如以下範例:

class Computer{
    ......
};
class Apple{
    ......
};
class MBP: public Computer, public Apple{
    ......
};

生很多小孩

有趣的來了,除了以上示範,還能生很多不同的個class變成家庭樹/親戚樹。
如以下Computer和Apple有MBP、Air、iMac三個sub class。

class Computer{
    ......
};
class Apple{
    ......
};
class MBP: public Computer, public Apple{
    ......
};  
class air: public Computer, public Apple{
    ......
};
class iMac:public Computer, public Apple{
    ......
};

注意

有個重點要很小心,如以下範例,在MBP繼承了Apple & Computer,然後藉由父母繼承 Tool的時候,MBP是同時繼承兩個 - Computer和Apple,這樣MBP就會繼承到同時兩個tool! 電腦會不知道該怎麼辦會出現錯誤喔。

class Tool{
    ......
};
class Computer: public Tool{
    ......
};
class Apple: public Tool{
    ......
};
class MBP: public Computer, public Apple{
    ......
};   
 

解決方法:

用virtual

class Tool{
    ......
};
class Computer: virtuel public Tool{
    ......
};
class Apple: virtuel public Tool{
    ......
};
class MBP: public Computer, public Apple{
    ......
};   

這樣就可以解決兩個tool的問題,這樣就只會有一個tool喔!

關於如何應用請參考下一篇~

Reference: Geeksforgeeks, tutorialspoint, cplusplus, w3school


上一篇
Day19 - C++ 資料流stream 和文字檔讀取file I/O
下一篇
Day21 C++ 循序搜尋Linear Search 和二元搜尋法Binary Search
系列文
C++超級菜鳥也可以懂的物件導向攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言