關於類繼承 與 物件布局

2021-05-05 19:55:42 字數 1482 閱讀 2861

最近在複習c++,看到csdn論壇上一道關於虛函式的問題,使得自己也去複習了相關東西,不是很深入,但對很多模糊的東西更加清晰,記錄一下:

1 指向類成員的指標並非指標(c++必知必會15條)

定義乙個類成員指標

int c::*pimc;

&c::_val 代表的是_val在類c中的偏移量,可以通過程式列印出來看看.

如果通過物件c *pc; pc->*pimc時 ,其時是由pc的位址加上偏移量來獲取物件的成員變數

2 指向成員函式的指標並非指標(c++必知必會16條)

這個還沒研究到很深入,具體可能需要參考一些編譯器實現細節,一般的定義以及使用從很多書上都可以參考到,這裡先不描述,在下面的虛函式中可以看到成員函式指標的使用

3 虛函式

為了實現多型,需要用到虛函式,虛函式定義使用可以參考一下程式,下面程式包括單繼承,以及多繼承來給出虛函式,虛表以及物件的布局。

通過程式我們將看到以下幾點:

1)  每個帶有虛函式的類或者繼承帶有虛函式的類,其物件必有乙個指向虛表的指標vptr

2)  虛表是屬於類的,每個類的物件都指向同乙個虛表,虛表的各項的內容是

a)         基類是基類虛函式的位址

b)        繼承類的虛表是:如果有覆蓋基類函式,就是繼承類虛函式的位址,如果沒有覆蓋,則指向與基類相同的基類虛函式位址

3)如果是多繼承,繼承類會有多個虛表指標,在繼承類中,物件的布局是按照繼承列表。

4 非虛擬:

普通成員函式是類共享的,物件呼叫時通過傳遞this指標,經常可以看到這麼個例子

c *pc = new c

pc ->p();

delete pc;

pc = null;

pc->p();

如果不涉及到pc的資料成員,是不會有問題的,因為pc是c類物件,p是類共享的

5 虛擬繼承問題(因為這個比較少用到,待深入研究)

虛擬繼承主要解決的問題:繼承二義性

布局:虛基類

繼承類有虛基類指標以及資料成員拷貝

6 關於獲取虛函式位址的表示式(一步步分析清楚就簡單了)

分步:1 取物件位址&b

2 轉換成整型指標指向(int*)(&b)

3 去指標內容為虛表位址(*(int*)(&b))

4 第乙個虛函式的位址*(int*)(*(int*)(&b))

5 轉換成函式指標(padd)( *(int*)(*(int*)(&b)))

(padd)(*((int*)(*(int*)&b)+1))

7 **及顯示結果分析

結果輸出:

還有更多深入東西,需要查閱更多資料,由於最近比較忙,所以先記錄一下

可以參考:c++必知必會,c++物件模型,thunk機制,vcall等資料

如有不正,請指出,感謝!

類與物件 繼承

繼承是物件導向的基本特徵之一,通過繼承機制,可以在已有的類的基礎上建立新類,新類可以繼承已有類的屬性和行為,也可以修改已有類的屬性和行為,或者增加新的屬性和行為以滿足自身特殊的需要。ifndef a h ifdef a h include using namespace std class a a ...

類和物件 關於繼承 關於介面

一 類和物件 物件將資料和操作打包在一起,類描述一切 用構造器建立物件 類和類之間的關係 關聯 組合,聚集 泛化二 關於繼承 祖先類object 方法重寫 tostring方法 equals方法 is a 是乙個 繼承關係 has a 有乙個 組合關係 三 關於介面 定義了一組功能 comparab...

類和物件與繼承

類與物件 1.類 類是客觀存在的,抽象的,概念的東西。public class dog void hungry 1.public 是類的修飾符,表明該類是公共類,可以被其他類訪問。2.class 是定義類的關鍵字。3.dog是類的名稱。4.name,age是類的變數,也叫屬性 bark hungry...