首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

面向對象設計模式:內部類實現多接口適配(避免多重繼承衝突)

     編輯:關於C++

問題動機

兩個基類 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 實現內部邏輯隔離。適用於需實現多個同名接口的組件設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved