C C 繼承 多型和虛函式整理

2021-06-23 02:29:47 字數 1784 閱讀 5782

關於c++中虛函式

1.怎麼初始化基類的建構函式

在派生類中,通過引數初始化表可以對基類的建構函式傳遞引數,進行初始化

2.多重繼承的二意性問題;可以將第二層派生類宣告為虛基類(盡量不要使用多重繼承)

class b:virtual public a    class c:virtual public  a    class d:public b,public c

在派生類d中不僅要對a初始化,還要對虛基類bc初始化,c++編譯器不會呼叫虛基類對基類建構函式的呼叫,

只會執行最後派生類對基類建構函式的呼叫。從而保證公共基類的引數沒有二義性。

3.基類和派生類的轉換

基類的指標可以指向派生類,只是記憶體指向空間變短,指向的只是從基類繼承的部分;

基型別的引用傳遞可以用派生類引用代替,同樣會丟失派生類自己的成員;

派生類只可以向上做型別轉換,以及賦值,會丟失精度;

不能向下做型別轉化,只能向下做指標指向;

4.繼承與組合關係

繼承關係解決的是「是」的關係,如貓、白貓、黑貓等就是「是」的關係

組合關係解決的是「有」的關係,如貓有四隻爪子,一條尾巴等

5.類庫c++

類庫中的類的宣告一般是放在標頭檔案中,類的實現是單獨編譯的,以目標**的形式放在系統某乙個目錄下,

使用者使用類庫是不用了解這些源**,但是必須標頭檔案的使用方法和庫的連線方法

基類是單獨編譯的,在程式編譯時只需對派生類新增的功能進行編譯,提高了效率。如果修改了基類,只要保證基類的公用介面不變,

派生類就不用修改,但基類要重新編譯,派生類也要重新編譯,否則不起作用。

使用類庫,使用者不知道成員函式的實現原始碼,保證基類型別安全;基類有時候只是乙個通用的框架,或者是高階抽象,或者通用資料結構,

供使用者在此基礎上新增功能。

6.設計類的層次結構

物件導向的開發過程中,需要精心設計類的層次結構,從抽象層到具體實現層,蹭蹭遞進,不斷變為具體。需要從系統的角度去考慮。

7.多型性:乙個結構,多種實現方法

靜態多型是通過函式過載實現,執行前就決定了要執行的方法,實現效率高;動態動態是通過虛函式實現的;

8.注意:派生類的析構函式要定義成虛函式,這樣可以當析構指向派生類的積累指標物件時,讓派生類也發生析構,否則派生會變成乙個懸掛指標。

同樣基類的同名函式也要加上virtual宣告,這樣就可以用指向派生類的基類指標,可以正常呼叫派生類的同名函式,不會發生型別精度損失。

9.基類中virtual宣告函式在派生類的同名函式自動變成虛函式,析構函式必須宣告為虛函式,派生類中的函式可以加virtual,也可以不加virtual,最好加上

與函式過載不同,虛函式可以與基類中的函式一模一樣,而函式過載則引數名稱和數量不能一樣。

訪問不同類層次的同名函式時,只需要將當前指標轉換為相應的類。即可通過prt->fun()訪問(執行時確定呼叫哪乙個物件的函式:動態關聯的過程)

虛函式實現多型性的實質,是動態關聯實現的;過載是靜態關聯(binding)

如果基類的析構函式被宣告為虛函式,那麼派生類的析構函式也自動變成了虛函式。

10.純虛函式

格式:virtual type name (paralist) =0;

含有純虛函式的類為抽象類,抽象類不能例項化,如果派生類仍然沒有實現基類定義的純虛函式,則此派生類扔為抽象類,仍然不能例項化

如果此虛函式在派生類沒有定義,這此函式仍為純虛函式,雖然不能例項化抽象類,但可以定義這種型別的指標變數,用來指向派生類,呼叫派生類的虛函式。

抽象基類是本類族的公共介面;name.fun();屬於靜態關聯;ptr->fun();屬於動態關聯;

C 虛函式和多型繼承

指標和引用是很好理解的,變數的引用相當於給變數取了個別名,在函式呼叫時,傳引用是會將引數列表的值改變的。include using namespace std int main 最終輸出的結果都是0x7ffdd9aff7b4,即為記憶體中儲存整型變數m的位址。對於虛函式,它是實現多型公有繼承的關鍵。...

繼承 虛函式和多型小結

一.知識點總結 繼承 1.定義 在已有類的基礎上建立新類的過程。乙個 b 類繼承 a類,或稱從類 a 派生類 b類 a 稱為基類 父類 類 b 稱為派生類 子類 2.類繼承關係的語法形式 class 派生類名 基類名錶 資料成員和成員函式宣告 基類名錶 構成訪問控制 基類名1,訪問控制 基類名 2 ...

C C 類的繼承 多型與虛函式 過載

物件導向的程式設計主要目的是提供可重複利用的 類的繼承也是 重用的一種方式。從已有的類 基類 派生出新的類,派生類 繼承了原有類的特性,同時在其基礎上進行擴充套件增加功能。1.繼承 派生類可以訪問基類的公有成員 派生類不能直接訪問基類的私有成員,必須通過基類的公有函式間接訪問私有成員 派生類的建構函...