C 中虛函式實現父類函式多型性

2021-10-02 06:40:57 字數 1216 閱讀 5900

今天專案用到了策略設計模式,其中需要實現子類函式的多型性,先總結複習一下。

一、小例子

話不多說,先上例程。

#include using namespace std;

class mouse

編譯時會報錯 如下圖所示:

錯誤為: 「undefined reference to 『vtable for ×××』」,這個問題主要是由於子類呼叫了父類的虛函式,在子類中沒有定義導致的虛函式表出現未定義錯誤。將程式修改如下:

class opticalmouse : public  mouse{

/*** 未重寫虛函式

*/virtual void click(){

cout<

starting: /home/xxdk/projects/virdemo/build/virdemo

optical mouse is clicked.

this is an opticalmouse.

*** exited normally ***

說明用父類的指標可以完成子類虛函式的呼叫,從而實現執行時多型。

二、虛函式的機制

虛函式是一種動態繫結機制,其中有兩個主要概念:vtable和vptr。

具體過程為:每乙個內含虛函式的類,編譯器都會為它做出乙個虛函式的表vtable,表中的元素指向乙個虛函式的位址。編譯器會為類別加上個成員變數,是乙個指向該虛函式表的指標vptr。

子類會繼承基礎類別的虛函式表,如上例所示,如果對於虛函式子類有同名的虛函式的話,就會覆蓋原父類的虛函式位址,從而達到通過指向父類的指標呼叫了子類的虛函式的功能,從而實現多型。但是如果子類的虛函式沒有實現的話就會出現上面說的undefined reference to 『vtable for ×××『的錯誤。

三、虛函式的使用

如上所述,為了使程式能夠實現多型的功能,應該在子類中實現父類的虛函式。為了更顯式地達到這個效果,在父類中應使用純虛函式來完成。即令虛函式=0,這樣在子類中必須實現所有純虛函式才能使類例項化,而用指向父類的指標則可以順利地使用子類的函式,從而達到多型化的效果。

c 多型性 虛函式

c 中多型性是指通過用virtual關鍵字來繫結同名同引數的函式,實現在編譯中進行後繫結,即在編譯過程中不繫結類,在執行時與具體的物件進行繫結,這樣就可以動態地與實際聯絡 比如乙個類 animal 有乙個虛函式breath 魚類 fish 也有函式breath 狗類 dog 函式breath 具體呼...

c 多型性 虛函式

虛函式與純虛函式的區別 1 擁有虛函式的類可以宣告物件,但擁有純虛函式的類不可以宣告物件 只能宣告乙個指標,並且不能給其分配記憶體 並且將這個類稱為抽象類 特點 1 虛函式是動態繫結的基礎。2 是非靜態的成員函式。在類的宣告中,在函式原型之前寫virtual。不能宣告為靜態函式 3 virtual ...

多型性 虛函式

先來講講賦值相容規則。前面說過,派生類如果是從基類公有繼承的,則它會包含基類中除建構函式和析構函式外的所有成員,基類的公有成員也成為派生類的公有成員,又因為物件只能訪問類的公有成員,所以基類物件具有的功能,派生類物件都有。這樣就引出了賦值相容規則。賦值相容規則就是指在基類物件可以使用的地方都可以用公...