在基類中加入virtual關鍵字的函式就是虛函式,在基類的派生類中就可以通過重寫虛函式來實現對基類虛函式的覆蓋。當基類的指標指向派生類的物件時,對指標虛函式的呼叫實際上是呼叫了派生類的虛函式。這是物件導向中多型性的體現。
例子:
class a
這個例子是虛函式的乙個典型應用。虛函式的虛是在所謂的「動態聯編」上,乙個類函式的呼叫並不是在編譯時刻被確定的,而是在執行時刻被確定的。由於編寫**的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以被稱為「虛」函式。
虛函式只能借助於指標或者引用來達到多型的效果。
純虛函式
1、定義
純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但是要求任何派生類都要定義自己的實現方方法。在基類中實現純虛函式的方法是在函式原型後面加「=0」,如:
virtual void funtion1()=0
2、引入原因
(1)為了方便使用多型特性,我們常常需要在基類中定義虛函式
(2)在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
純虛函式的引入很好的解決了上述問題,將宣告了純虛函式的類稱為抽象類,它不能生成物件,即使用者不能建立類的例項,只能建立它的派生類的例項。
3、特徵:
純虛函式最顯著的特徵是:它們必須在繼承類中重新宣告函式(後面就不要在加0啦,否則該派生類也不能例項化),而且他們在抽象類中往往沒有定義。
4、目的
定義純虛函式的目的在於,使派生類僅僅只是繼承函式的介面。讓所有的派生類物件都可以執行純虛函式的動作,但類無法為純虛函式提供乙個合理的預設實現。
所以類純虛函式的宣告就是在告訴子類的設計者:「你必須提供乙個純虛函式的實現,但是我不造你會怎樣實現它」。
來個例子吧,方便以後理解:
header.h
#include // 公共抽象基類vehicle
class vehicle
;// 派生於vehicle的具體類car
class car : public vehicle
};// 派生於vehicle的具體類airplane
class airplane : public vehicle
};
source.cpp
// source.cpp
#include "stdafx.h"
#include #include "header.h"
// 通過指標run任何vehicle
void run_vehicle(const vehicle* vehicle)
int main()
結果:
在c++語言中, 純虛函式可用一種特別的語法定義 ,見以下示例:
class abstract ;
抽象類中實現的呼叫可以採用以下這種形式:
void abstract::pure_virtual()
class child : public abstract ;
void child::pure_virtual()
舉乙個例子作為結束:
抽象基類"mathsymbol"可能提供乙個純虛函式 dooperation(), 派生類 "plus" 和 "minus" 提供dooperation() 的具體實現. 由於 "mathsymbol" 是乙個抽象概念, 為其每個子類定義了同一的動作, 在 "mathsymbol" 類中執行 dooperation() 沒有任何意義. 類似的, 乙個給定的 "mathsymbol" 子類如果沒有 dooperation() 的具體實現是不完全的.
c 虛函式,虛表相關總結
物件導向,從單一的類開始說起。class a 這個類中有兩個成員變數,都是int型別,所以這個類在記憶體中占用多大的記憶體空間呢?sizeof a 8個位元組,乙個int占用四個位元組。下圖驗證 這兩個資料在記憶體中是怎樣排列的呢?原來是這樣,我們根據debug出來的位址畫出a物件在記憶體的結構圖 ...
C 中虛函式和純虛函式的總結
虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否則會出現函式未定義的錯誤。virtual void print 2 ...
C 虛函式簡單總結
2016 07 07 14 39 187人閱讀收藏 舉報 c 59 在類的繼承層次結構中,在不同層次中可以出現名字相同 引數個數和型別都相同的函式。簡單地說,被virtual關鍵字修飾的成員函式,就是虛函式。格式 virtual 函式返回值型別 函式名 引數列表 舉例 cpp view plain ...