子類重新定義父類的函式重寫,但是只有父類函式宣告為虛函式的時候,才可以通過下面這種指標的方式進行呼叫,否則只能是呼叫父類的函式:
#include
class
base
virtual
void
rewrite()
};class
derived
:public base
void
rewrite
() override };
intmain()
輸出結果:
base show()
derived rewrite()
在c++11以及以後,重寫虛函式最好是新增override
關鍵字,方便理解和糾錯。
虛析構函式的作用就是為了在多型的時候,能合適的呼叫子類的析構函式,給出下面**的例項:
#include
class
baseno
~baseno()
};class
derivedno
:public baseno
~derivedno()
};class
base
virtual
~base()
};class
derived
:public base
virtual
~derived()
};intmain()
輸出結果:
baseno created
derivedno created
baseno destroyed
----------------
base created
derived created
derived destroyed
base destroyed
虛表:虛表儲存了一系列的函式指標,每個類都有乙個虛表,這是類級別的。
虛指標:指向虛表的指標,每個物件都有乙個虛指標,這是物件級別的。
編譯器在下面兩個地方新增**來維護和使用虛表:
建構函式。物件在構造時,會建立乙個虛指標,指類的虛表
多型函式呼叫。當多型呼叫發生的時候,程式會先根據虛指標去檢視虛表,在虛表中會找到匹配的函式,之後進行函式呼叫,這是發生在執行期的,會損失一定的效能。
虛函式不要在建構函式中呼叫,因為建構函式中構造虛指標,此時呼叫虛函式,那麼虛函式就會向非虛函式那樣執行,所以父類和子類的虛函式都會執行一次
虛函式一般不要宣告成內聯inline
的形式。在父類引用和父類指標呼叫的虛函式,不能內聯;但是子類物件的虛函式可以內聯。但是建議不要內聯。
靜態函式不能是虛函式!!!
智慧型指標不需要宣告虛析構函式也可以自動析構,但是還是建議宣告成虛析構函式!!!
#include
#include
class
base
~base()
virtual
void
show()
};class
derived
:public base
~derived()
virtual
void
show()
};intmain()
輸出:
base created
derived created
derived
derived created
base destroyed
但是,如果是如下情況,就無法使用智慧型指標判別,所以建議以後使用std::make_shared
:
// 只給出主函式,其餘的和上面一樣
intmain()
; sp-
>
show()
;return0;
}
輸出結果:
base created
derived created
derived
base destroyed
虛函式與虛表
虛函式作用 c 中的多型,進行動態繫結 父類指標可指向子類的物件 直到執行時才知道要具體呼叫哪個版本 哪個類定義 的函式 它是通過虛表實現的,簡單理解如下 分析 include using namespace std class base virtual void g virtual void h ...
c 虛函式與虛表深度解析
首先來看一下單繼承,編譯下面的 include include using namespace std class grandam class mother public grandam class daughter public mother int main 結果如下圖所示 第四個結果就是呼叫的...
C 虛函式 虛表和純虛函式
定義 用virtual修飾的成員函式稱為虛函式 重寫 覆蓋 當在子類中定義了乙個與父類完全相同的虛函式時,則稱這個子類的函式重寫 或覆蓋 了父類的函式 例 includeusing namespace std class person virtual void h1 int b class deri...