c 虛繼承詳解

2021-07-01 20:46:30 字數 1501 閱讀 3338

#include

using namespace std;

class a;};

class b : public virtual  a;

};class c: public virtual  a;

virtual void t(){};

};int main() 

;virtual void foo(void){}

int x;

};a:很簡單 乙個虛表指標 +乙個 x 一共是8byte

struct b :virtual public a

;virtual void foob(void){}

int y;

};b:虛繼承,ok 那就是 sizeof(a)+乙個指向虛基類的指標4byte+判斷b中的虛函式是不是從a繼承的,如果是則這一部分是0,如果不是則還要再加4byte 存放 虛表 那麼 b一共就是20byte。

struct c : virtual public a

virtual void fooc(void){}

int z;

};c的分析同a

struct d : public b, public c

virtual void food(void){}

int l;

};d:公共繼承b,c,那麼 直接 sizeof(b)+sizeof(c)+自己的乙個虛指標-因為b,c都是虛繼承a,那麼b和c中關於a的指標只要儲存乙個,所以要減去4個位元組,那麼d最後一共就是40byte ok

int _tmain(int argc, _tchar* argv)

else cout << hex << ptr[i] <<" = " << hex << * ((int*)(ptr[i])) <}

cout << "--------------------------------------" <

b b;

ptr = (int*)&b;

cout <<"addr:" << ptr << " sizeof = " << sizeof(b) else cout << hex << ptr[i] <<" = " << hex << * ((int*)(ptr[i])) <}

cout << "--------------------------------------" <

d d;

ptr = (int*)&d;

cout <<"addr:" << ptr << " sizeof = " << sizeof(d) else cout << hex << ptr[i] <<" = " << hex << * ((int*)(ptr[i])) <}

return 0;

}最後一段話很重要:那就是 各個編譯器執行的關於虛繼承的結果不一樣,很簡單,他們處理虛表的機制不一樣,但是有一點可以肯定的是,虛繼承就是為了解決菱形繼承中,b,c都繼承了a,d繼承了b,c,那麼d關於 a的引用只有一次,而不是 普通繼承的 對於a引用了兩次……

所以上面分析的都是浮雲 沒用的東西

**:

C 繼承,虛繼承 記憶體結構 詳解

目錄 class test1 private int num1 class test2 public test1 private int num2 void main test2記憶體結構 檢視記憶體發現父類在子類的上面 在原有的 基礎上增加了test3類 test3類繼承了 test2和test1...

C 虛繼承和虛基類詳解

多繼承 multiple inheritance 是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。儘管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜複雜的設計問題,命名衝突就是不可迴避的乙個。多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都...

C 虛繼承和虛基類詳解

多繼承 multiple inheritance 是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。儘管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜複雜的設計問題,命名衝突就是不可迴避的乙個。多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都...