C 中虛函式多型實現的原理刨析

2021-10-18 17:44:53 字數 2296 閱讀 8081

虛函式關鍵字:virtual

未寫virtual關鍵字前:

#include

using

namespace std;

class

animal};

class

cat:

public animal };

void

test()

intmain()

輸出結果:

新增了virtual關鍵字後:

#include

using

namespace std;

class

animal};

class

cat:

public animal };

void

test()

intmain()

輸出結果:

區別:

**本意是呼叫貓類裡面的speak函式,但是未在父類speak函式前加virtual關鍵字時,呼叫的是父類的speak函式,加了virtual關鍵字後,呼叫的是貓類裡面的speak函式,這就是多型

多型:

不同類的物件對同一訊息的不同響應

注意:

虛函式實現條件 :

1.有繼承關係

2.子類重寫父類的虛函式

動態多型的使用:

父類的指標或者引用指向子類的物件

未寫虛函式前:

寫了虛函式後:

未寫虛函式前,空物件a的大小為1,寫了虛函式後,物件a的大小為4,是因為此時a裡面存放了乙個vfptr虛函式(表)指標,指標大小無論型別均為4個位元組大小該虛函式指標指向乙個虛函式表

當子類未重寫父類虛函式時(即cat類裡面沒有與animal類裡面speak同名的函式):

當子類重寫了父類虛函式時:

當發生虛函式重寫時,子類會把自己的虛函式覆蓋掉之前父類的虛函式

因此當父類的指標或者引用指向子類物件的時候,會發生多型,你傳入的是cat物件,就去cat的虛函式表中找speak函式的入口位址

C 繼承中的多型 虛函式 虛析構函式

從c 繼承中的相容原則中我們知道 父類指標可以直接指向子類物件,父類引用可以直接引用子類物件。當父類和子類有相同方法時呼叫的是父類方法,即是根據指標型別或引用型別來確定呼叫的方法型別的。如果我們想根據指標實際指向的物件型別 引用實際引用的型別 來決定呼叫的方法型別,需要把這個函式宣告為虛函式,這就是...

C 虛析構和虛函式的原理

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...

C 中虛函式的實現原理

1 對於c 中的虛函式一直都是靠著死記硬背的方式在使用,今天特地查閱了一下它的實現原理。2 虛函式 c 中為了實現多樣性的乙個工具。使用virtual關鍵字修飾的函式即為虛函式,派生類自動繼承虛函式性質。使用時,用基類指標指向派生類物件,直接呼叫派生類的虛函式。達到 介面與實現分離的目的 多樣性,相...