首頁  >  文章  >  後端開發  >  C++複習要點總結之十-多型(一)

C++複習要點總結之十-多型(一)

黄舟
黄舟原創
2017-01-16 11:50:561303瀏覽

多態的理解:

是一個物件導向新需求:

根據實際的物件類型來判斷重寫函數的呼叫

如果父類別指標指向的是父類別物件則呼叫父類別中定義的函數

如果父類別指標指向的是父類別物件則呼叫父類別中定義的函數

如果父類別指標指向的是子類別物件則呼叫子類別中定義的重寫函數C++複習要點總結之十-多型(一)



解決方案:

Ø C++中透過virtual關鍵字對多態進行支援

Ø 使用virtual聲明的函數重寫後即可展現多態性特性

//物件導向3大概念

封裝

突破了C語言函數的概念。 。

繼承

程式碼復用 。 。 。 。我復用原來寫好的程式碼。 。 。

多態

多態可以使用未來。 。 。 。 。 80年代寫了一個框架。 。 。 。 。 。 90年代人寫的程式碼

多態是我們軟體產業追尋的一個目標。 。 。

//寫了一個框架,可以呼叫後來人,寫的程式碼的能力

進一步的理解

//間接賦值成立的3個條件:

//1 定義兩個變數。 。 。

//2 建立關聯 。 。 。 。

//3 *p

//多態成立的三個條件:

//1 要有繼承

//2 要有函數重寫。 。 。 C 虛函數

//3 要有父類指標(父類參考)指向子類物件

//多態是設計模式的基礎,多態是框架的基礎

知識點1 虛析構函數

析構函數是為了釋放資源,

當釋放資源時有需求不能直接對物件釋放時如:

C *myC = new C; //C繼承B,B繼承A類

delete myC; / /直接透過子類物件釋放資源這種情況不需要寫virtual 關鍵字

需要透過父類指標將所有的子類都物件的析構函數都執行一遍

想透過父類指標釋放所有的子類資源(需要在最終父類的析構函數中加上virtual關鍵字)


void howtodelete(A *base)
{
delete base; //这句话不会表现成多态 这种属性
}

知識點2:重載和重寫區別

函數重載

必須在同一類中進行

子函數重載

必須在同一類中進行

子類別無法重載父類別的函數,父類別同名函數會被名稱覆蓋(例如:父類別中有函數a(),子類別中也有函數a(),但是還有函數a(int b)這個​​函數就是重載父類別函數產生錯誤!類別與子類別中的函數必須有完全相同的原型

使用virtual聲明之後能夠產生多態性(如果不使用virtual,那叫重定義)

多態是在運行期間根據具體物件的類型決定函數調用

範例分析:

//1 C++编译器 看到func名字 ,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数
//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.
//3 C++编译器开始报错..... error C2661: “Child::func”: 没有重载函数接受 4 个参数
//4 若想调用父类的func,只能加上父类的域名..这样去调用..
c1.func(1, 3, 4, 5);
//c1.func();
//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置
//因为子类中已经有了func名字的重载形式。。。。
//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数

3 重點:

C++中多態的實作原理

當類別中宣告虛函數時,編譯器會在類別中產生一個虛函數表 

類別成員函數指標的資料結構 

虛函數表是由編譯器自動產生與維護的 

virtual成員函數會被編譯器放入虛擬函數表中 

存在虛函數時,每個物件中都有一個指向虛擬函數表的指標(vptr指標) 


C++複習要點總結之十-多型(一)

C++複習要點總結之十-多型(一)

C++複習要點總結之十-多型(一)說明1:

程式

透過虛函數表所調用操作才能確定真正應該呼叫的函數。而普通成員函數是在編譯時就決定了呼叫的函數。在效率上,虛函數的效率要低很多。

說明2:

出於效率考慮,沒有必要將所有成員函數都宣告為虛擬函數

說明3 :C++編譯器,執行HowToPrint函數,不需要區分是子類別物件還是父類別物件

C++複習要點總結之十-多型(一)以上就是C++複習要點總結之十-多型(一)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn