C 多型的實現機制深入理解

2022-09-27 02:06:11 字數 1685 閱讀 3691

1. 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。

2. 存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。

3. 多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。

4. 多型用虛函式來實現,結合動態繫結。

5. 純虛函式是虛函式再加上= 0。

6. 抽象類是指包括至少乙個純虛函式的類。

多型的簡www.cppcns.com單介紹

一般來說,多型分為兩種,靜態多型和動態多型。靜態多型也稱編譯時多型,主要包括模板和過載。而動態多型則是通過類的繼承和虛函式來實現,當基類和子類擁有同名同參同返回的方法,且該方法宣告為虛方法,當基類物件,指標,引用指向的是派生類的物件的時候,基類物件,指標,引用在呼叫基類的方法,實際上呼叫的是派生類方法。這就是動態多型。

靜態多型的實現

靜態多型靠編譯器來實現,簡單來說就是編譯器對原來的函式名進行修飾,在c語言中,函式無法過載,是因為,c編譯器在修飾函式時,只是簡單的在函式名前加程式設計客棧上下劃線"_" 。而c++編譯器不同,它根據函式的型別,個數來對函式名進行修飾,這就使得函式可以過載,同理,模板也是可以實現的,針對不同型別的實參來產生對應的特化的函式,通過增加修飾,使得不同的型別引數的函式得以區分。

以下段程式為例

#include

using namespace std;

template

int fun(t1 t1, t2 t2){}

int foofun(){}

int foofun(int){}

int f程式設計客棧oofun(int , float){}

int foofun(int , float ,double){}

int main(int argc, char *ar**)

經過編譯之後:

只選取main函式部分來看:

可以發現,呼叫的函式名均發生了變化,都加了相應的修飾,使得呼叫的函式是不一樣的,靜態多型就是如此。

動態多型的實現

宣告乙個類時,如果類中有虛方法,則自動在類中增加乙個虛函式指標,該指標指向的是乙個虛函式表,虛函式表中存著每個虛函式真正對應的函式位址。動態多型採用一種延遲繫結技術,普通的函式呼叫,在編譯期間就已經確定了呼叫的函式的位址,所以無論怎樣呼叫,總是那個函式,但是擁有虛函式的類,在呼叫虛函式時,首先去查虛函式表,然後程式設計客棧在確定呼叫的是哪乙個函式,所以,呼叫的函式是在執行時才會確定的。

在宣告基類物件時,虛函式表中繫結的就是基類的方法的位址。在宣告派生類物件時,虛函式表中繫結的就是派生類的方法。在物件被建立之後(以指標為例),無論是基類指標還是派生類指標指向這個物件,虛函式表是不會改變的。

以下段程式為例:

#include

using namespace std;

class base

};class derived : public base

};int main(int argc, char *ar**)

執行結果如下:

從結果可以看出,當乙個物件被建立之後,在呼叫虛函式的時候,無論是派生類指標還是基類指標指向這個物件,呼叫虛函式的結果是一樣的。因為,虛函式表是不變。當然,有可能在多繼承中會有多個虛函式表從而導致函式呼叫時呼叫不同的虛函式表,這裡不做考慮。

本文標題: c++多型的實現機制深入理解

本文位址:

深入理解C 多型及實現機制

1 多型 多型是物件導向程式的核心概念。c 的多型實現是基於繼承和虛函式,這種實現稱為動態多型性。多型性可以簡單的概括為 1個介面,多種方法 在程式執行的過程中才決定呼叫的機制,簡單的說就是可以通過父類指標呼叫子類的函式,可以讓父類指標有多種形態。2 問題引入 先看下面幾個問題 code sampl...

深入理解Java多型機制

目錄 1,多型的概念?2,存在的條件?3,案列解析?4,應用場景?1,多型的概念 父類引用指向子類物件,通俗點就是,在編譯時不繫結是什麼方法,根據你傳進來的值,是什麼就會執行什麼。2.存在條件 第一,要有繼承 第二,要有方法的重寫 第三,父類引用指向子類物件 3,案列解析 好好體會以下這個案例,通過...

深入理解c 多型實現原理

多型是指通過基類的指標或者引用,在執行時動態呼叫實際繫結物件函式的行為。與之相對應的編譯時繫結函式稱為靜態繫結。多型是物件導向程式設計的核心思想之一,因此我們有必要深入探索一下它的實現原理。理解了原理才能更好的使用。前置條件 現有 如下所示,非常簡單的例子。通過基類的引用呼叫recv函式來觸發多型。...