多型之虛函式

2021-07-10 04:17:31 字數 1226 閱讀 6323

虛函式實現執行時多型。

虛函式宣告只出現在類定義函式原型宣告中,而不能在成員函式實現的時候。

虛函式一般不宣告為內聯函式,因為虛函式訪問時需要動態繫結,而內聯函式是靜態的。

virtual關鍵字可以省略,當基類中已經宣告了虛函式,那麼派生類中和基類同返回值,同名,同形參的函式即使沒有加virtual也可判定為虛函式。

建構函式不可以是虛函式,析構函式可以是虛函式。

為什麼需要虛析構函式?

當通過基類指標刪除派生類物件時,如果允許他人通過基類指標呼叫派生類的析構函式(delete),就要將基類的析構函式宣告為虛析構函式,否則delete的值是不確定的。

示例**:虛函式

#include using namespace std;

class base1 ;

void base1::display() const

class base2 : public base1 ;

void base2::display() const

class derived : public base2 ;

void derived::display() const

void fun (base1 *ptr)

int main()

執行結果:

如果沒有宣告為虛函式,則執行結果都是base1『s display

虛表和動態繫結

(1)虛表

每個多型類都有乙個虛表,虛表裡儲存了虛函式的入口位址,類物件有乙個指向虛表的指標。

(2)動態繫結

建構函式為物件的虛指標賦值,通過虛指標可以找到虛表,通過虛表找到虛函式的入口位址,通過入口位址呼叫虛函式。

虛表示例**:

class base ;

class derived : public base ;

對應的虛表示意圖:

C 多型之虛函式

問題 用基型別的指標指向派生類物件時,通過這個指標來訪問該物件,這是會出現訪問到的只是從基類繼承來的同名成員。解決方法 在基類中將這個同名函式宣告為虛函式,這樣就可以通過基型別的指標,訪問不同派生類的物件產生不同的行為,從而實現執行過程的多型。語法 virtual 函式型別 函式名 形參表 注意 必...

多型實現之虛函式

多型的實現分為靜態多型和動態多型,靜態多型主要靠函式過載,動態多型主要靠虛函式 當類中宣告了虛函式之後,該類的記憶體映像會獲得乙個虛表指標,叫做 vfptr指向該類的虛表,下面的我測試使用的類圖 有的沒必要的東西沒有寫 這裡恰好還是乙個菱形繼承,但是就像我之前說的虛繼承和虛表關係不大,所以單繼承也是...

虛函式多型

一 知識點 1 乙個操作隨著所傳遞的物件型別的不同能夠做出不同的反應,其行為模式成為多型。p413 2 基類與派生類的同名操作,只要標記上virtual,則該操作便具有多型性。p416 3 一旦標記基類的函式為虛函式,便有連鎖反應,後面繼承的類中一切同名成員函式都變成了虛函式。如果是引發實際複製動作...