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