多重繼承時,若多個基類有同名成員,直接訪問會產生二義性。需顯式指定作用域:
class A { public: void f() {} };
class B { public: void f() {} };
class C : public A, public B {};
C c;
c.A::f(); // 必須指定
c.B::f();
c.f() 報錯。class AuxA : public A { public: virtual void Afun() = 0; void fun() override { Afun(); } };
class AuxB : public B { public: virtual void Bfun() = 0; void fun() override { Bfun(); } };
class C : public AuxA, public AuxB {
void Afun() override { cout << "A in C"; }
void Bfun() override { cout << "B in C"; }
};
virtual 繼承可確保只有一份基類子對象。虛基類情況下,派生類中重定義的虛函數優先於基類原始定義,消除二義性:
class A { virtual void f() {} };
class B : virtual public A {};
class C : virtual public A { void f() override {} };
class D : public B, public C {}; // D::f() 解析為 C::f(),無二義性
需共享功能時,優先考慮提取公共基類(單繼承菱形)而非多重繼承。多重繼承引入的復雜性(二義性、佈局開銷、構造順序)往往超過其便利性。
核心觀點:深入理解 C++ 對象模型語義,而非死記語法規則。例如:
對 C++ 越深刻,設計決策越清晰,避坑能力越強。