兩個基類 Base1、Base2 擁有同名虛函數 open(int)。直接多重繼承會導致衝突,無法區分調用哪個基類的實現。
外部類 Derived 不繼承基類,而是包含兩個內部類 Base1_Impl、Base2_Impl 分別公有繼承對應基類。內部類通過 friend 訪問外部類私有實現函數 base1_open()、base2_open()。外部類提供轉換操作符 operator Base1&()、operator Base2&() 實現向上轉換。
class Derived {
class Base1_Impl; friend class Base1_Impl;
class Base1_Impl : public Base1 {
Derived* parent;
public:
Base1_Impl(Derived* p): parent(p) {}
int open() override { return parent->base1_open(); }
} base1_obj;
class Base2_Impl; friend class Base2_Impl;
class Base2_Impl : public Base2 {
Derived* parent;
public:
Base2_Impl(Derived* p): parent(p) {}
int open() override { return parent->base2_open(); }
} base2_obj;
int base1_open() { return 111; }
int base2_open() { return 222; }
public:
Derived() : base1_obj(this), base2_obj(this) {}
operator Base1&() { return base1_obj; }
operator Base2&() { return base2_obj; }
};
// 使用
Derived d;
base1_open(d); // 隱式轉換到 Base1&
base2_open(d); // 隱式轉換到 Base2&
Chromium 網絡模塊 HttpCache 使用內部類 Transaction 實現內部邏輯隔離。適用於需實現多個同名接口的組件設計。