/* test.cpp
* Created on: 2014.04.20
* Author: Spike
*/
#include <iostream>
using namespace std;
class A { char k[5]; public: virtual void aa() {}; };
class B : virtual public A { char j[6]; public: virtual void bb() {}; };
class C : virtual public B { char i[7]; public: virtual void cc() {}; };
int main() {
cout << "sizeof(A) = " << sizeof(A) << endl; // 12 (5+3 padding + 4 vptr)
cout << "sizeof(B) = " << sizeof(B) << endl; // 24 (A 12 + 6+2 padding + 4 vbptr)
cout << "sizeof(C) = " << sizeof(C) << endl; // 36 (B 24 + 7+1 padding + 4 vbptr)
return 0;
}
sizeof(A) = 12
sizeof(B) = 24
sizeof(C) = 36
虛擬函式/虛擬繼承的記憶體開銷取決於編譯器實作。GCC 採「每類別一 vptr + 每虛擬基類別一 vbptr」;MSVC 採「單一虛擬表 + 虛擬繼承額外 vbptr/vptr」。設計時勿假設固定大小。