C++對象記憶體布局--⑦VS編譯器--虛擬繼承多個基類
//VS編譯器--虛擬繼承多個基類.cpp//2010.8.18//測試發現,如果衍生類別覆蓋了基類的虛函數那麼被覆蓋的虛基類虛函數表前面會有一個0值。//之前一直沒注意到發生重寫時會有“間隔”的問題。如要考慮上“間隔”,那麼又要複雜上許多。//這個“間隔”到底用意何在?是否是在多態的時候有所應用?//猜測可能是一標記。因為衍生類別重寫了虛基類的虛函數,而這個虛函數的地址又沒有放在衍生類別的虛函數表中,//而且虛擬繼承基類跟衍生類別執行個體的位置跟普通繼承是不同的。//VS編譯器#include <iostream>using namespace std;////////////////////////////////////////////////////class BaseA{public: BaseA(int a = 10):a(a) { }virtual void f(){cout << "BaseA::f()" << "\t" << a << endl;}int a;};////////////////////////////////////////////////////class BaseB{public : BaseB(int b = 20):b(b) { }virtual void f(){cout << "BaseB::f()" << "\t" << b << endl;}int b;};////////////////////////////////////////////////////class Derived :virtual public BaseA, virtual public BaseB{public: Derived(int c = 100):c(c) { }void f(){cout << "Derived::f()" << "\t" << c << endl;}virtual void ff(){ cout << "Derived::ff()" << "\t" << c << endl;}int c;};////////////////////////////////////////////////////intmain(){Derived obj;int** p = (int**)&obj;cout << "sizeof = " << sizeof(obj) << endl;for (int i = 0; i != sizeof(obj)/4; ++i){ cout << p[i] << endl;} typedef void (__thiscall *fun)(void*pThis);//非常重要/*通過虛函數表調用函數*/((fun)(p[0][0]))(p);//((fun)(p[0][1]))();錯誤((fun)(p[4][0]))(p+4);((fun)(p[7][0]))(p+7);system("pause");return 0;}/*sizeof = 360041C2000041C20400000064000000000041C1F80000000A000000000041C1F000000014Derived::ff() 100Derived::f() 100Derived::f() 100請按任意鍵繼續. . .*/