C 虛函式,多型,覆蓋等相關資訊

2022-08-28 10:57:11 字數 1640 閱讀 8192

---恢復內容開始---

一.c++的四大特徵:

抽象:認識事物的一種方法,把所觀察到的事物簡化,概括出來,為我們所用。

封裝:是類和物件的特徵,將資料組織在一起,從外部無法直接訪問資料,從而加強了資料的安全性

繼承:繼承就是在對物件抽象的結果進行歸納總結,找出他們的共性,形成基類,在加上差異生成派生類

多型:如果子類中的成員函式對父類中的成員進行了覆蓋,當乙個指向中子類的父類指標或引用了子類的父類引用,當使用   它呼叫虛函式,然後根據實際的呼叫物件呼叫子類中的覆蓋函式,而不是父類呼叫了虛函式,同一種類發出同一種呼叫,而產生不同的影響

二.覆蓋,過載 ,隱藏

滿足覆蓋(也叫重寫)的條件:

必須是類成員,必須是虛函式,函式名(引數,返回值都一樣)相同,父子類關係的指標或引用

滿足過載的條件:

必須在統一作用域下,函式相同但是引數列表不同,const屬性相同,返回值型別不會影響過載

隱藏:父子類之間名字相同的識別符號,只要能構成覆蓋,必定能構成隱藏

三.多型的條件:

前提是父子之間構成覆蓋,必須是以父類的指標或引用指向子類

當指標或引用已經構造多型時,此時呼叫成員所傳的this指標再呼叫成員函式時也可以構造多型。   

在子類的建構函式執行前會先呼叫父類的建構函式,如果呼叫被覆蓋的虛函式,由於子類還沒有構造完成,因此只能是呼叫父類中的虛函式。

建構函式在進入函式體執行時,類中看的見的資源已經全部構造完成。

在子類的析構函式執行完成後會再呼叫父類的析構函式,如果呼叫被覆蓋的虛函式,由於子類已經開始析構完成已經不能算是完整的子類了,因此只能呼叫父類中的虛函式。

四.純虛函式:

純虛函式不需要被實現,如果要實現,必須在類外

純虛函式必須以多型的方式呼叫

1. 成員函式只有純虛函式的叫抽象類,這種類不能建立物件

2. 子類會全部繼承父類的純虛函式,必須把父類的純虛函式覆蓋才能建立物件

3. 抽象類只能以指標或者引用的方式指向子類來呼叫自己的非純虛函式

4. 純抽象類的應用場景

**模式,命令模式,生產者與消費者模式,單例模式,工廠模式

五、虛函式表

1、什麼是虛函式表,當乙個類中有虛函式時,編譯器會為這個分配乙個表專門記錄這些虛函式,在類中會乙個隱藏的指標成員來指向這張表。

2、如何證明這張表存在。

有虛數的類會比沒有虛函式的類(相同中的)多4位元組,還會新增補齊和對齊。

3、乙個類只有乙個張虛函式表,所有的物件共享一張虛函式表。

4、一般物件的前4個位元組是指向虛函式表的指標變數

七、虛析構

1、如果通過父類指標或引用指向子類物件,當使用delete釋放物件時,此時只能呼叫父類的析構函式,如果在子類中使用new/malloc申請的記憶體資源,那麼將導致記憶體洩漏。

2、解決方法就是把父類的析構函式設定為虛函式。

3、在設計類時如果析構函式什麼都不需要做,編譯器也會生成乙個空的析建構函式,但這樣會讓繼承它的子類有安全隱患。

4、最好把所有的析構函式都設定為虛函式。

那麼建構函式能不能使用虛的呢?

這樣會形成乙個死迴圈,

因為通過父類的指標或引用去指向子類物件的時候,會先呼叫父類的建構函式,但是虛的,被子類中的建構函式覆蓋,呼叫子類中的建構函式,但是通過指標或引用又返回去,就這樣形成乙個迴圈;

虛函式,覆蓋和多型

一.函式宣告中的virtual關鍵字 形如 class 類名 的成員函式,稱為虛函式或方法 class shape 一.在子類中覆蓋基類的虛函式 如果子類的成員函式和基類的虛函式具有相同的函式原型,那麼該成員函式就也是虛函式,無論其是否帶有virtual關鍵字,且對基類的虛函式構成覆蓋 class ...

隱藏和覆蓋 多型 虛函式 C

隱藏 overhide 派生類中隱藏了基類中所有的同名函式 同名 不同參 繼承關係下的不同作用域 覆蓋 派生類中同名同參的虛函式覆蓋基類中同名同參的虛函式 同名同參 繼承關係下的不同作用域 均為虛函式 隱藏 class base void show protected int ma class de...

過載覆蓋多型和虛函式

現在整理出來,希望可以記住這個。函式的名稱一樣,但是引數不同,就是過載 函式的名稱知道了,但是編譯的時候不知道呼叫哪個函式,過載決議 根據引數決定到底應該呼叫哪個函式 區別就是 呼叫的引數不一樣 對於非虛函式,子類和基類同名 不管引數 那麼就是導致覆蓋 如果引數完全一樣,那麼會完全覆蓋,只會留下子類...