虛函式實現執行時多型。
虛函式宣告只出現在類定義函式原型宣告中,而不能在成員函式實現的時候。
虛函式一般不宣告為內聯函式,因為虛函式訪問時需要動態繫結,而內聯函式是靜態的。
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 一旦標記基類的函式為虛函式,便有連鎖反應,後面繼承的類中一切同名成員函式都變成了虛函式。如果是引發實際複製動作...