c 多型和虛函式

2021-09-11 01:44:53 字數 2185 閱讀 2096

c++有三大特性:封裝,繼承,多型

多型是物件導向程式設計的乙個重要特徵,多型就是乙個東西有多重狀態,具有不同功能的函式可以用乙個函式名,這樣就可以用乙個函式名實現不同的功能

靜態多型和動態多型靜態多型是利用過載實現的,在程式編譯時確定要呼叫的是哪個函式,也稱為編譯時多型。動態多型是利用虛函式實現的,在程式執行期間才動態的確定操作所指對的物件,也稱為執行時多型

動態多型:當乙個基類被繼承為不同的派生類時,各派生類可以使用與基類成員相同的成員名,如果在執行時用同乙個成員名呼叫類物件的成員,會呼叫哪個?通過繼承而產生了相關的不同派生類,與基類成員同名的成員在不同的派生類中有不同的含義

在類的繼承層次結構中,在不同的層次中可以出現名字相同、引數個數型別相同的函式,這時系統會根據同名覆蓋的原則決定呼叫的物件

如果你要呼叫同名的父類中的函式的話,必須在呼叫使用時註明類域。虛函式的作用就是允許在派生類中重新定義與基類同名的函式,並可以通過基類指標或引用來訪問基類和派生類中同名函式

在父類中宣告display函式時,在左端加上**關鍵字virtual**,這樣就將父類中的display函式宣告為虛函式

class father

基類的指標是用來指向基類物件的,如果用它來指向派生類的物件,則進行指標型別的轉化,即基類指標指向的是派生類中從基類中繼承的部分。宣告為虛函式之後,在派生類中的虛函式取代了基類原來的虛函式,因此在使用基類指標指向派生類物件後,呼叫虛函式就是呼叫了派生類的虛函式

在類中將某一成員函式宣告為虛函式,只是因為派生類的需求,在基類中預留乙個函式名,具體功能留給派生類定義,這時可以將基類中的虛函式宣告為純虛函式

virtual void fun(int x,int y)=0;
純虛函式沒有函式體,這種形式就是告訴編譯器,是乙個純虛函式,留在派生類中定義。

含有純虛函式的類就成為抽象類。抽象類只是一種基本的資料型別,根據需求在派生類定義各種功能。這個類的作用就是為派生類提供乙個公共介面,抽象類不能定義物件,但是可以定義指向抽象類的指向變數。

當父類的指標或引用指向父類物件時呼叫的是父類虛函式,當指向子類物件時呼叫的是子類的虛函式,這是通過虛函式表實現的,虛函式表是通過一塊連續記憶體來儲存虛函式的位址

使用虛函式,系統會有一定的空間開銷,當乙個類中有虛函式時,編譯系統會為該類構造乙個虛函式表,是乙個指標陣列,用來存放每個虛函式入口位址,虛函式表的最後乙個元素是乙個空指標

每乙個虛函式表都是乙個函式指標陣列,而每乙個虛函式表都由乙個虛函式表指標維護,這個虛函式表指標叫做_vptr。

單繼承模式

class father

virtual void fun1()

{} virtual void fun2()

{}private:

int _f;

};class son:public father

virtual void fun1()

{} virtual void fun3()

{} virtual void fun4()

{}private :

int _s;

};typedef void(*func)();

void printvtable(int *vtable)

virtual void fun1()

virtual void fun1()

{ cout<

菱形多重繼承的物件模型中,先是b中的虛函式表指標,再是b從a繼承的成員變數,最後是b的成員變數。接下來是c中的虛函式表指標,最後是c的成員變數。最後是d的成員變數。d中的虛函式fun4()的位址則存放到了第乙個虛函式表的最後

由於fun2()函式一直沒有被重寫,所以還是a的函式,而fun1()函式最終被d中的fun1()函式過載,所以虛函式表中的fun1函式被d中的虛函式fun1()位址覆蓋

c 虛函式和多型 虛函式表

參考 1 c primer plus 第六版 2 中國大學慕課 程式設計與演算法 三 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式 class a 類外函式定義 void a function 說明 1 virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加 2 建構...

C 之虛函式和多型

1.虛函式 簡單的說,虛函式就是在函式原型前加上virtual關鍵字。函式一旦被宣告為虛函式,即使類在改寫它的時候沒有將其宣告為虛函式,它從該點的繼承層次結構中仍然是虛函式。如果基類中乙個函式被宣告為虛函式,在若干子類中有著不同的實現,那麼我們在建立若干子類的不同物件時,可以用基類的指標或者引用來指...

C 中虛函式和多型

1.c 中的虛函式 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtt...