C 中的虛函式

2021-10-20 12:14:06 字數 2319 閱讀 9828

.前言

虛函式是實現動態繫結的函式,在c++中虛函式的作用是實現多型的機制。

常用情景是需要用基類型別的指標指向其派生類的例項,然後通過基類指標去呼叫派生類例項的成員函式。

.情景

我們希望定義乙個基類和多個派生類,他們都有同樣的名字的成員函式,但實現細節不同,我們希望通過乙個通用函式根據傳入的類的物件去呼叫各類的函式。

**:

#include

using

namespace std;

class

base1

//基類base1定義};

class

base2

:public base1//公有派生類base2定義};

class

derived

:public base2//公有派生類derived定義};

void

fun(base1* ptr)

//引數為指向基類物件的指標

intmain()

我們的期望輸出是:

base1::

display()

base2::

display()

derived::

display

()

實際結果:

base1::

display()

base1::

display()

base1::

display

()

因此,不要重新定義繼承而來的非虛函式不成功原因:

在編譯階段,編譯器根據指標無法判斷在執行時它會指向什麼樣的物件,所以指標是什麼型別的,它就會呼叫對應型別的成員函式。

即在函式void fun(base1* ptr)我們給指標定義的是base1的型別,因此它只能呼叫base1的 函式。

既然在編譯階段無法確定要呼叫的類的函式,你們我們可以在執行時再確定——「虛函式」

修改後:

class

base1

//基類base1定義

};

結果:

base1::

display()

base2::

display()

derived::

display

()

.概括用virtual關鍵字說明的函式就是虛函式

虛函式是實現執行時多型性基礎(而靜態多型性即編譯階段,則靠過載完成)

c++中的虛函式是動態繫結的函式

虛函式必須是非靜態的成員函式,虛函式經過派生之後,就可以實現執行過程中的多型。

.什麼函式可以是虛函式

一般成員函式可以是虛函式

建構函式不能是虛函式

析構函式可以是虛函式

.格式即其他相關事項

虛函式的宣告

virtual 函式型別 函式名(形參表)

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

在派生類類中可以對基類的成員函式進行覆蓋

虛函式一般不宣告為內聯函式,因為對虛函式的呼叫是需要動態繫結的,而對內聯函式的處理是靜態的。(同樣也不能加static,不過反正也加不了)

.虛析構函式

如果你打算允許其他人通過基類指標呼叫物件的析構函式(通過delete這樣做是正常的),就需要讓基類的析構函式成為虛函式,發展執行delete的結果是不明確的。

.另:虛函式實現原理

虛函式是依靠一張虛表(virtual table)來實現的,簡稱為v-table。這張表解決了繼承、覆蓋的問題,保證其容真實反應實際的函式。

.虛表每個多型類都有乙個虛表

虛表中有當前類的各個虛函式的入口位址

每個物件有乙個指向當前類的虛表的指標(虛指標vptr)

.動態繫結的實現

建構函式中為物件的虛指標賦值

通過多型型別的指標或引用呼叫成員函式時,通過虛指標知道虛表,進而找到所呼叫的虛函式的入口位址

通過入口位址呼叫虛函式

C 中的虛函式 純虛函式

c 最重要的特性就是多型,而多型,就主要通過虛函式實現的。具體的實現過程是 基類中的函式定義為虛函式,派生類發生覆蓋 即函式名稱 引數列表 返回值型別完全相同 的情況下,派生類中的函式也會自動變成虛函式,不論加不加virtual關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...

C 中的虛函式

c 中的虛函式 virtual function 1.簡介 虛函式是c 中用於實現多型 polymorphism 的機制。核心理念就是通過基類訪問派生類定義的函式。假設我們有下面的類層次 class a class b public a 那麼,在使用的時候,我們可以 a a new b a foo ...

C 中的虛函式

c 中的虛函式 一 雖然很難找到一本不討論多型性的c 書籍或雜誌,但是,大多數這類討論使多型性和c 虛函式的使用看起來很難。我打算在這篇文章中通過從幾個方面和結合一些例子使讀者理解在c 中的虛函式實現技術。說明一點,寫這篇文章只是想和大家交流學習經驗因為本人學識淺薄,難免有一些錯誤和不足,希望大家批...