虛函式是
c++語言中的乙個相當重要的概念,特別對於
c程式設計師來說,本身並沒有精力去系統的學習
c++中的一些概念,比如虛基類、虛函式等,
c++語言不似
c語言這般簡潔,紛繁複雜,像是大雜燴,這也是我早期相當討厭
c++語言的原因,但是它也有其獨到之處,作為現代的
c程式設計師,難免會接觸
c++,而也是因為
c++語言的繁亂,所以我們學習的時候一定要抓住本質,下面的是我針對
c++中虛函式的一些總結
,我們將從虛函式的定義、作用功能、應用舉例、實現機制由淺入深的來闡述虛函式,希望在昇華自我的同時也能夠幫助到讀者
......... 一、
虛函式的定義
虛函式必須為基類的非靜態函式和非建構函式
其訪問許可權可以是protected
,當然也可以是
public
在基類中定義虛函式的一般形式:
virtual 函式返回值型別 虛函式名(形參表)
特出情況:如果基類中無法實現該函式或者沒有必要實現那麼可以採用純虛函式
純虛函式的形式:
virtual 函式返回值型別 虛函式名
= 0 ;
而包含有純虛函式的類我們成為抽象類。
基類中定義過的虛函式若在派生類中重新定義,那麼是否加
virtual
修飾就隨你而定 二、
虛函式的作用
實現動態聯編(編譯時不知道具體行為,當執行時才可確定),
基類中定義了虛函式過後可以在其派生類中重新定義,若沒有重新定義那麼將繼承基類 中的虛函式,但發現函式前
virtual
之後,系統會自動按照動態聯編來處理,
虛函式也是c++
中多型的一種實現,即不同物件傳入相同訊息後的不同表現
實現動態聯編一般需要以下三個條件: 1、
必須把動態聯編的行為定義為類的虛函式。 2
、類之間存在子型別關係,一般表現為
乙個類從另乙個類公有派生而來。
3、必須先使用基類指標指向子型別的物件,然後直接或者間接使用基類指標呼叫虛函式
三、應用舉例
animal
animal();
virtual ~animal();
virtual void shout();
char *name;
dogdog();
virtual ~dog();
cat
cat();
virtual ~cat();
animal 派生 dog 和 cat
#include
#include
class animal ;
animal::animal(char *name)
animal::~animal()
class dog : public animal ;
dog::dog(char *name):animal(name)
dog::~dog()
void dog::shout()
class cat : public animal ;
cat::cat(char *name):animal(name)
cat::~cat()
void cat::shout()
int main(int argc, char **argv)
一、實現機制
a virtual f();
vtable:
f() g() e()
virtual g();
virtual e(); b
virtual t();
vtable:
t() v() y()
virtual v();
virtual y();
c繼承a和b c
virtual t();
vtable:
f()
g()
e()
virtual v();
t()
v()
y()
virtual f();
virtual g();
其中紅色的為在子類中覆蓋了父類函式,黑色為沒有覆蓋,注意,c
的例項不可以呼叫
e() y
(),當
c例項化物件時候,就會給它分配乙個
vptr
指標指向該類的虛表,用父類物件指標指向子類物件,也同樣會呼叫被子類覆蓋了的函式。
虛函式實現機制
c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式。當程式發現虛函式名前的關鍵...
虛函式實現機制
說到虛函式的實現方法,我們就不得不說到動態聯編 dynamic binding 和靜態聯編 static binding 靜態聯編意味著編譯器能夠直接將識別符號和儲存的實體地址聯絡在一起。每乙個函式都有乙個唯一的實體地址,當編譯器遇到乙個函式呼叫時,它將用乙個機械語言說明來替代函式呼叫,用來告訴cp...
虛函式的實現機制
將函式宣告為virtual時,在背後發生了什麼呢?編譯器在編譯的時候,發現animal類中有虛函式,此時編譯器會為每個包含虛函式的類建立乙個虛表 即vtable 該表是乙個一維陣列,在這個陣列中存放每個虛函式的位址。對於例1 2的程式,animal和fish類都包含了乙個虛函式breathe 因此編...