繼承和多型

2021-07-13 09:01:16 字數 2783 閱讀 8315

程序在建立的時候先是建立虛擬位址空間,並不是真正的一塊空間,而是建立了乙個資料結構(《程式設計師的自我修養》第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*

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

類還有乙個重要的特性就是繼承,什麼是繼承?它又有什麼作用呢?繼承最主要的目的就是為了擴充套件原類的功能,加強或改進原類所沒有定義的屬性及方法。例如我們有狗這個類,可是狗的種類還是有很多,比如說博美狗,聖伯納,柴犬等等,如果只用狗一種類來定義所有種類狗的屬性及方法,那麼用這個類所產生出來的物件一定會有...