#include
using namespace std;
class AA {
public:
int a;
void sayHello() { cout << "this is AA" << endl; }
};
class BB {
public:
int b;
void sayHello() { cout << "this is BB" << endl; }
};
class CC : public AA, public BB {
public:
int d;
void sayHello() { cout << "this is CC" << endl; }
};
int main() {
CC cc;
cc.sayHello(); // 調用 CC::sayHello()
cc.AA::sayHello(); // 顯式調用 AA::sayHello()
cc.BB::sayHello(); // 顯式調用 BB::sayHello()
cc.CC::sayHello(); // 顯式調用 CC::sayHello()
cout << "Size AA: " << sizeof(AA) << endl; // 4
cout << "Size BB: " << sizeof(BB) << endl; // 4
cout << "Size CC: " << sizeof(CC) << endl; // 12
return 0;
}
this is CC this is AA this is BB this is CC Size AA: 4 Size BB: 4 Size CC: 12
cc.sayHello() → 派生類版本(遮蔽基類)cc.AA::sayHello() → 基類 AA 版本(作用域解析)cc.BB::sayHello() → 基類 BB 版本sayHello,直接調用 cc.sayHello() 會報錯「二義性」AA: int a (4) → 4 BB: int b (4) → 4 CC: AA(4) + BB(4) + int d(4) → 12
CC 對象 (12 字節): +--------+--------+--------+ | AA::a | BB::b | CC::d | | (4B) | (4B) | (4B) | +--------+--------+--------+ 偏移 0 偏移 4 偏移 8
CC* → AA*:偏移 0(第一基類)CC* → BB*:偏移 +4(第二基類)static_cast/dynamic_cast 中自動處理,void* 強轉會丟失(見文章 2610)
class Base { int x; };
class A : virtual public Base { int a; };
class B : virtual public Base { int b; };
class C : public A, public B { int c; };
Base 子對象vbptr(虛基類表指針),對象大小增加sizeof(C) 通常 > 非虛繼承版本static_cast/dynamic_cast,禁止 void* 中轉C++ 多重繼承將所有基類子對象按順序拼裝,對象大小為各部分之和。同名函數在派生類中會遮蔽基類版本,需通過作用域解析符顯式調用。理解內存佈局與指針偏移是正確使用多重繼承的前提,現代 C++ 開發建議盡量用組合替代。