C 基礎 虛函式 純虛函式 普通函式

2021-08-08 20:40:11 字數 1834 閱讀 1120

為什麼要使用虛函式

說明

為什麼要使用純虛函式

什麼情況下使用純虛函式

滿足以上兩點,可考慮宣告為純虛函式。

/* 例1 */

class a

//輸出結果:

function in class a

function in class a

function in class b

function in class a

//原因:

(1)靜態聯編:編譯器在編譯時就確定好了函式呼叫

(2)只是普通函式「重定義」,不管引用的例項是哪個類的,呼叫的時候系統會呼叫 「左值」 那個物件所屬類的方法

>>> 所以基類a指標p最終呼叫類a的funprint()函式,輸出兩個function in class a

>>> 類b例項呼叫類b的funprint()函式,類b加上作用域操作符a::呼叫類a的funprint()函式

/* 例2 */

#include

using

namespace

std;

class a

; virtual

void fun2() //虛函式

;void fun1() //純虛函式實現

//輸出結果:

fun1 in class b //純虛函式在基類中宣告在子類中實現

fun2 in class b //動態聯編:多型。虛函式在子類中重寫,執行時動態繫結

fun3 in class a //靜態聯編:編譯時就確定好了呼叫哪個函式。呼叫左值所屬類的方法

*******************

fun1 in class b

fun2 in class b //動態聯編:多型。虛函式在子類中重寫,執行時動態繫結

fun3 in class b //靜態聯編:呼叫左值所屬類的方法

class a

//輸出結果:

function in class a

function in class b

//原因:

(1)動態聯編:根據例項的不同動態決定呼叫哪個函式

(2)虛函式的唯一目的就是為了實現多型(動態多型性),編譯時不確定呼叫哪個函式,而是動態的決定要呼叫哪個函式,即「執行時多型」

>>> 所以基類a指標p指向類a的例項a就呼叫類a的funprint()函式,

>>> 指向類b的例項b就呼叫類b的funprint()函式

class vehicle

;class car:public vehicle

//輸出結果:

car tyre four

bike tyre two

//原因:

(1)定義vehicle類,但是具體每種交通工具有多少個輪子是不一定的,就定義為純虛函式、留待派生類中具體實現

區別

抽象類

使用

acknowledgements:

推薦)

2017.09.28

C 普通函式 虛函式和純虛函式

首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式 定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式 定義乙個函式為純虛函式,才代表函式沒有被實現 定義他是為了實現乙個介面,起到乙個規範的作用,規範繼承這個 類的程式設計師必須實現這個函式。對繼承的影響 普通的類 沒有虛函式...

虛函式 純虛函式 普通函式 虛析構函式

虛函式 純虛函式 普通函式 虛析構函式 其他 靜態成員函式實現隱藏,當前檔案可見,出了這個檔案就不可見了,所以多個檔案可以定義相同的名字。出了作用域之後不銷毀,程式結束才銷毀。靜態成員函式不屬於物件,它與任何物件都是無關的,因此靜態成員函式沒有this指標。也就是說 非靜態成員函式有this指標,而...

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...