多態(tài)的實現(xiàn)機制:
為臨朐等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及臨朐網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站制作、成都做網(wǎng)站、臨朐網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
C++中虛函數(shù)的主要作用就是用來實現(xiàn)多態(tài),就是使用基類的指針或者引用調(diào)用重寫的虛函數(shù),當父類的指針或引用指向父類對象時調(diào)用的是父類虛函數(shù),當指向子類對象時調(diào)用的是子類的虛函數(shù)。那么這又是怎么實現(xiàn)的呢???
這都是通過虛函數(shù)表實現(xiàn)的,虛函數(shù)表是通過一塊連續(xù)內(nèi)存來存儲虛函數(shù)的地址。這張表解決了虛函數(shù)重寫(地址進行覆蓋)的問題 。在有虛函數(shù)的對象實例中都有一張?zhí)摵瘮?shù)表,虛函數(shù)表就像一張地圖,指明了實際調(diào)用的虛函數(shù)函數(shù)。
例:
class Base { public: Base() :_b(1){} virtual void fun1() { } virtual void fun2() { } private: int _b; };
虛函數(shù)表的最后一個元素是一個空指針。
既然我們知道了虛函數(shù)的地址,那么就可以通過過找到這塊地址來調(diào)用這個虛函數(shù)。這也導致了多態(tài)的不安全性,效率降低。
typedef void (* pfun)(); void PrintfBase(pfun *_ppfun) { int i = 0; for (i = 0; _ppfun[i] != NULL; i++) { _ppfun[i] (); } } void test() { Base b; PrintfBase((pfun *)*((int *)(&b))); }