C 技術 多型 抽象類

2021-08-28 04:57:37 字數 1671 閱讀 1764

2.實現過程是: 用基類的指標類指向派生類的位址,在呼叫虛函式(因為呼叫虛函式是通

過查虛表執行函式的,但虛表中的虛函式指標可以在繼承的時候被子類覆蓋)。

3.在多型中會出現父類指標指向子類,那麼父類指標用完後會 delete,那麼這時候缺省會調

用父類的虛構函式,如果子類中有記憶體要釋放,那就被洩露掉了,為了解決這問題就把基

類的析構函式設定為虛函式。

4 .如果虛函式在基類與派生類中出現,僅僅是名字相同,而形式引數不同,或者是返回型別不同,那麼即使加上了virtual關鍵字,也是不會進行滯後聯編的。

5. 只有類的成員函式才能說明為虛函式,因為虛函式僅適合用與有繼承關係的類物件,所以普通函式不能說明為虛函式。 

6. 靜態成員函式不能是虛函式,因為靜態成員函式的特點是不受限制於某個物件。 

7. 內聯(inline)函式不能是虛函式,因為內聯函式不能在執行中動態確定位置。即使虛函式在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非內聯的。 

8. 建構函式不能是虛函式,因為構造的時候,物件還是一片位定型的空間,只有構造完成後,物件才是具體類的例項。 

9. 析構函式可以是虛函式,而且通常聲名為虛函式。

1. 純虛函式並不需要實現,如果乙個類中的有純虛函式那麼這個類就是抽象類

什麼情況下使用純虛函式:

在基類本身生成物件是不合情理的時候,

比如:動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常

理。為了解決這個問題,方便使用類的多型性,引入了純虛函式的概念,將函式定義為純

虛函式(方法:virtual 函式返回型別 函式名()= 0;),則編譯器要求在派生類中必須予以

重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。

2. 應用場景:專案負責人一般可以建立乙個抽象類,每個功能函式都宣告為純虛函式,接下程式設計師根據這個抽象類重寫每個

純虛函式,這樣專案負責人和專案小組成員可以很好形成溝通。

三  知識擴充:概念的區別:即過載重寫(覆蓋),以及重定義(同名隱藏)

1.過載是指在同一作用域中允許有多個同名函式,而這些函式的引數列表不同,包括引數個數不同,型別不同,次序不同,需要注意的是返回值相同與否並不影響是否過載。

2.重寫(覆蓋)重定義(同名隱藏)則有點像,區別就是在寫重寫的函式是否是虛函式,只有重寫了虛函式的才能算作是體現了c++多型性,否則即為重定義,在之前的**中,我們看到子類繼承了基類的fun()函式,若是子類沒有fun函式,依舊會呼叫基類的fun函式,若是子類已重定義,則呼叫自己的fun函式,這就叫做同名隱藏,當然此時如果還想呼叫基類的fun函式,只需在呼叫fun函式前加基類和作用域限定符即可。

3. 用表圖表示關係:

多型 抽象類

多型 當中體現多型性,就是父類指向子類 左父右子 格式 父類名稱 物件名 new 子類名稱 介面名稱 物件名 new 實現類名稱 使用多型,物件向上轉型,是絕對安全的,但物件一旦向上轉型父類,就不能呼叫子類原本特有的類容 物件向下轉型,就是還原的動作 格式 子類名稱 物件名 子類名稱 父類物件 含義...

C 學習 多型 抽象類

多型 概念 run time binding 函式名和函式入口點的繫結發生在程式執行時刻 complie time binding 程式再編譯時進行函式名和函式入口的繫結 多型的本質 run time binding 多型的條件 1.必須有繼承 2.子類要把虛函式重寫 override 派生類的vi...

c 多型(四) 抽象類

抽象類也叫做介面類,在虛函式的後面寫上 0 那麼這個函式就變成了乙個純虛函式,包含純虛函式的類叫做抽象類,其不能例項化出物件。繼承了基類的派生類也不能例項化出物件,除非重寫純虛函式,只有重寫了純虛函式,派生類才能例項化物件。也就是說,純虛函式規範了派生類必須重寫虛函式,另外,純虛函式更體現出了介面繼...