繼承和多態

進程在創建的時候先是創建虛擬地址空間,並不是真正的一塊空間,而是創建了一個數據結構(《程序員的自我修養》第6章 進程的創建)

繼承和多態:
1)繼承就是對代碼的複用

2)由於構造和析構只在自身所在的類的作用域下起作用,因此基類的構造函數和析構不能被繼承

3) 繼承方式有三種: 公有繼承(public)保護繼承(protect)私有繼承(private)

當繼承方式爲公有繼承時,基類的public protect 在派生類中依舊是public protect

當繼承方式爲保護繼承時,基類的public protect 在派生類中均爲 protect

當繼承方式爲私有繼承時,基類的public protect 在派生類中均爲private

無論是哪種訪問方式,基類的私有成員或成員方法均可以被繼承,但在派生中不可見,不能訪問
那如果我要想在派生中訪問基類的私有成員變量的話,那麼我可以在派生中調用能訪問該成員變量或成員方法的成員方法,從而間接訪問私有的數據成員;另一種不太好的辦法就是將派生聲明爲基類的友元。

4)當繼承方式缺省時,也就是省略了繼承方式時,那麼繼承方式默認就是私有的繼承方式

5)基類的成員方法不佔用派生類的內存,只有成員變量佔用派生類的內存。

6)派生類在繼承基類的所有的數據成員和成員函數的同時,也繼承了基類的作用域,從而當基類的成員變量和派生類的成員變量同名時,不會產生歧義,因爲其作用域不同。

7)當出現嵌套的繼承的時候,在繼承時,我們只看直接的基類,而不看間接的基類。

8)繼承的構造順序:
1)構造基類中的成員對象
2)構造基類
3)構造派生中的成員對象
4)構造派生
繼承的析構順序和構造順序相反

9)在主函數中進行函數調用時,派生類中如果沒有該成員方法,則調用派生從基類繼承的方法
如果不想直接調用派生的方法,想直接調用基類,則可以在函數名前加上基類的作用域
如果要構成重載函數,則必須這兩個函數在同一個作用域,否則不能構成重載。

10)派生和基類中同名的成員函數之間的關係有三種:

1.重載 2.隱藏 3.覆蓋

a)重載是指在同一個作用域下的函數,一般情況下,給派生或基類中的函數加上類作用域纔會構成重載(作用域相同,this指針不同)。

b)隱藏:只是函數名相同,參數列表和作用域不相同,成爲隱藏,派生的方法隱藏基類的同名方法。

c)覆蓋:不同作用域下,函數名相同,參數列表和返回值都相同,而且基類的方法是虛函數(virtual),指針指向誰,就調用誰的成員函數。
這裏寫圖片描述

這裏寫圖片描述

11)動多態:運行時的多態(虛函數)
靜多態:編譯時的多態(重載函數,模板等,編譯時就確定了要用什麼類型實例化,確定要調用哪個函數)

用基類指針調用同名方法時,是否可以調用要看該基類中有無該方法(且繼承方式爲public),編譯時看基類,運行時看派生類。

何種情況下可以將一個函數寫爲虛函數:
當基類指針指向堆上動態開闢的派生類,在delete基類型指針時,只會析構基類,而不能析構派生類對象時,我們可將基類的析構函數寫成虛函數,這時派生類的析構也相當於是一個析構函數,從而派生類的析構可以覆蓋基類的析構,繼而派生類對象也被析構。

12)那麼是否是所有的函數都可以作爲虛函數呢?
這裏寫圖片描述

13)當調用同名覆蓋方法時是一種多態。
這裏寫圖片描述
RTTI指的是生成對象的類型
基類對象和派生對象之間的賦值:
這裏寫圖片描述

14)多態性:一個名字可以具有多種語義,函數重載,類模板,和函數模板都具有多態性利用多態性,用戶只需要發送一般形式的消息,將所有的實現都留給接收消息的對象,對象根據接收到的消息而做出相應的操作,虛函數是實現多態性的另一重要機制。

16)編譯階段 push call函數地址
運行階段,多態:
Mov ecx ptr dwrd[p];//將虛函數表的地址給ecx
Mov eax ptr dwrd[ecx];//將虛函數表第0行虛函數地址放入eax
Call eax;

17)析構函數爲什麼可以寫成虛函數?
當基類指針指向堆上動態開闢的空間存放的是派生類對象時,在析構(delete 基類指針 )時,派生類對象不能被析構,因此我們需要給基類的析構函數加上virtual 使其變爲虛函數,與此對應派生類中的析構也是虛函數,因此派生類析構會覆蓋基類的析構。從而派生類中的析構會正常調用。

18)發生多態的三個必要條件:(缺一不可)
a)通過指針或引用調用函數
b)調用的函數是虛函數
c)對象存在
通過對象本身調用虛函數不是多態。
構造函數中調用虛函數不會產生多態,因爲對象還未存在。
這裏寫圖片描述
類型的強制轉化只是爲了編譯通過,但這種強轉是有風險的,但仍舊是構成多態,派生類指針指向基類對象,運行時類型是Base*

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章