探解c 多型

2021-05-22 19:01:37 字數 1453 閱讀 7585

對c++多型的探解

什麼是多型呢?請看如下程式 例1

class base;

class drive1 : public base;

class drive2 : public base

return 0;

}//output

drive1::func

drive2::func

這就是多型。 c++中的多型通常是用虛函式實現的,但也有中template技術實現的,atl中就是用template的技術實現了多型。就效能上說,用虛函式的方法,程式的效能會相對較差點。那麼編譯器到底悄悄做了什麼呢?請看小馬哥翻譯的 「atl布幔之下的秘密」http://www.vckbase.com/document/viewdoc/?id=1350。完了再往下看。我們知道當類中有虛函式的時候,編譯器會偷偷給類加上乙個vfptr指標,指標指向乙個vtable,vtable中虛函式的位址。不信?請看vs給的圖。

有類:class foo

public :

int a;};

產生乙個物件 foo f

那麼定義乙個foo的指標會是什麼情況呢? 請看-> foo *p

同樣,foo型別的指標指向的記憶體塊也有vfptr和成員變數a,只是沒有」初始值「。所以可以猜想,當把派生類的指標賦給父類指標的時候,派生類的基類子物件裡的vfptr會賦值給基類指標的vfptr,從而實現了多型的行為。

請看例1的程式,除錯截圖。

那麼多重繼承的情況又是如何?考慮如下程式

#include

using namespace std;

class base1

;class base2;

class drive : public base1, public base2

多重繼承情況下,派生類的物件裡會有連個vfptr,排放的順序和繼承的順序相關。

當把派生類的指標賦值給p2的時候,好心的編譯器又會偷偷的加上些東西。由於派生類的base2子物件的vfptr排在base1子物件的vfpt的後邊,所以就會有乙個偏移量--4個位元組,(因為指標是乙個32的整數,4*8)。當base2 *p2 = new drive;時,new返回的指標會加上4再賦值給p2,編譯器都為我們做好了。

看圖

裡邊的[thunk]:drive::func`adjustor`就為4個位元組的偏移量,thunk結構由編譯器維護。具體結構挺複雜,有待研究。

現在,相信你對c++會有新的認識了吧。c++的編譯器太好心了,總是偷偷的,默默無聞的為我們操心。

C 多型 繼承多型

什麼是多型?個人理解為 在程式語言繼承關係中,子類能替代父類,表現出不同的行為。換句話說 在繼承關係中,乙個類被例項化被其子類替代,子類中有父類的虛方法重寫,或者有父類同名方法 new 呼叫相同方法時候,將表現出子類或者父類中不同行為 老闆,上 static void main string arg...

C 語句函式再探

1.表示式只計算,拋棄計算結果 2.空語句什麼也不做 3.switch case語句漏寫break,將會從匹配到的情況開始執行,直到語句結束 4.形參 實參 區域性變數 靜態區域性變數 所謂形參就是佔位之用,在函式開始時申請空間,並由傳入實參進行例項化 也可稱拷貝構造 一般是區域性的,即只能在函式體...

C 多型 靜態多型與動態多型

多型 顧名思義,多型就是多種形態,也就是對不同物件傳送同乙個訊息,不同物件會做出不同的響應。並且多型分為靜態多型和動態多型。靜態多型就是在系統編譯期間就可以確定程式執行到這裡將要執行哪個函式,例如 函式的過載,物件名加點操作符執行成員函式等,都是靜態多型,其中,過載是在形成符號表的時候,對函式名做了...