C 多型知識點大總結

2021-10-12 03:08:44 字數 3697 閱讀 1991

三、抽象類

四、多型的原理

五、單繼承和多繼承關係中的虛表函式

本篇文章**及解釋都是在vs2013下的x86程式中,涉及的指標都是4bytes。

多型的概念:通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的物件去完成時會產生出不同

的狀態。舉個例子:

多型是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。比如student繼承了person。person物件買票全價,student物件買票半價。那麼在繼承中要構成多型還有兩個條件

必須通過基類的指標或者引用呼叫虛函式;

被呼叫的函式必須是虛函式,且派生類必須對基類的虛函式進行重寫。

在多型條件滿足的前提下,程式編譯時,編譯器無法知道p到底引用的是哪個類的物件,因此不會去確定p.buyticket()該函式的行為(具體呼叫哪個類的虛函式);只有在程式執行起來之後,才能確定p到底指向的是哪個類的物件。

虛函式:即被virtual修飾的類成員函式稱為虛函式。

class

person

};

虛函式的重寫(覆蓋):派生類中有乙個跟基類完全相同的虛函式(即派生類虛函式與基類虛函式的返回值型別、函式名字、引數列表完全相同),稱子類的虛函式重寫了基類的虛函式。

class

person};

class

student

:public person

};

虛函式重寫的兩個例外:協變(基類與派生類虛函式返回值型別不同).派生類重寫基類虛函式時,與基類虛函式返回值型別不同。即基類虛函式返回基類物件的指標或者引用,派生類虛函式返回派生類物件的指標或者引用時,稱為協變。

析構函式的重寫(基類與派生類析構函式的名字不同)

如果基類的析構函式為虛函式,此時派生類析構函式只要定義,無論是否加virtual關鍵字,都與基類的析構函式構成重寫,雖然函式名不相同,看起來違背了重寫的規則,其實不然,這裡可以理解為編譯器對析構函式的名稱做了特殊處理,編譯後析構函式的名稱統一處理成destructor。

final:修飾虛函式,表示該虛函式不能再被繼承

class

car}

;class

benz

:public car

};

override: 檢查派生類虛函式是否重寫了基類某個虛函式,如果沒有重寫編譯報錯。

在虛函式的後面寫上 =0 ,則這個函式為純虛函式。包含純虛函式的類叫做抽象類(也叫介面類),抽象類不能例項化出物件。派生類繼承後也不能例項化出物件,只有重寫純虛函式,派生類才能例項化出物件。純虛函式規範了派生類必須重寫,另外純虛函式更體現出了介面繼承。

class

car;

普通函式的繼承是一種實現繼承,派生類繼承了基類函式,可以使用函式,繼承的是函式的實現。虛函式的繼承是一種介面繼承,派生類繼承的是基類虛函式的介面,目的是為了重寫,達成多型,繼承的是介面。所以如果不實現多型,不要把函式定義成虛函式。

通過觀察,我們發現b物件時8位元組,除了_b成員,還多了乙個 _vfptr放在物件的前面(注意有些平台可能會放到物件的最後面,這個跟平台有關),物件中的這個指標我們叫做虛函式表指標(v代表virtual,f代function)。乙個含有虛函式的類中都至少都有乙個虛函式表指標,因為虛函式的位址要被放到虛函式表中,虛函式表也簡稱虛表。我們進一步觀察

//派生類重寫了f1(),f3(),新增加了f4(),f5()

總結如下

派生類物件d中也有乙個虛表指標,d物件由兩部分構成,一部分是父類繼承下來的成員,另一部分是自己的成員。

. 基類b物件和派生類d物件虛表是不一樣的。f1和f3重寫,f2從基類中繼承,f4和f5新增。(如果基類中有函式不是虛函式,雖然也會被繼承下來,但是不會放進虛表中)。

虛函式表本質是乙個存虛函式指標的指標陣列,這個陣列最後麵放了乙個nullptr。

. 總結一下派生類的虛表生成:a.先將基類中的虛表內容拷貝乙份到派生類虛表中 b.如果派生類重寫了基

類中某個虛函式,用派生類自己的虛函式覆蓋虛表中基類的虛函式 c.派生類自己新增加的虛函式按其在派生類中的宣告次序增加到派生類虛表的最後。

虛表存的是虛函式指標,虛函式和普通函式一樣的,都是存在**段的,物件中存的是虛表指標,虛表在vs下存在**段。

靜態繫結又稱為前期繫結(早繫結),在程式編譯期間確定了程式的行為,也稱為靜態多型,比如:函式過載

動態繫結又稱後期繫結(晚繫結),是在程式執行期間,根據具體拿到的型別確定程式的具體行為,呼叫

具體的函式,也稱為動態多型。

在4.1中的例子已經詳細說明,可參考。

觀察上圖可知:多繼承派生類的未重寫的虛函式放在第乙個繼承基類部分的虛函式表中。

java多型知識點總結

多型 一種事物有多種表現形式。物件導向的最後乙個特徵,繼承和封裝都是為多型打基礎!生活中的多型 打招呼 中國人 你好 英國人 hello 日本人 拷逆七娃 南韓人 阿娘哈賽you 泰國人 薩瓦迪卡 1 方法的多型性 方法的重寫和過載 2 物件的多型性 物件的轉型上!person p new stud...

多型知識點

多型知識點總結如下 1 含有純虛函式的類稱為抽象類 2 抽象類不可以實現例項化 3 繼承抽象類的函式如果沒有實現所有的純虛函式也為抽象類 4 純虛函式的實現格式 virtual void print 0 5 繼承類在實現純虛函式時,可以略去關鍵字virtual,但一般建議必寫 便於維護 6 乙個虛函...

多型知識點

1.乙個物件擁有多種形態,稱為物件的多型性,如劉星既有學生形態,也有人類形態。2.中體現多型性 子類被當作父類使用 格式為 fu aa new zi 父類名稱 物件名 new 子類名稱 介面名稱 物件名 new 實現類名稱 3.fu bb new zi 當直接通過物件名稱呼叫方法時,看等號右邊是誰,...