首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 虛基類菱形繼承同名函數:衍生類必須覆寫消除二義性

     編輯:程式設計綜合問答

虛基類 `vihicle` 有 `run()`,`bicycle`/`motorcar` 虛繼承並覆寫 `run()`,`mb`/`mm` 再繼承並引入 `run1`/`run2`,最底層 `motorbicycle` 繼承 `mb`/`mm` 且實作 `run1`/`run2`,但未覆寫 `run()`,導致 `b3->run()` 編譯錯誤「繼承不明確」。

原因

`bicycle::run()` 和 `motorcar::run()` 分別覆寫了虛基類的 `run()`。`motorbicycle` 同時繼承兩條路徑,**編譯器無法決定呼叫哪一個 `run()`**,必須在 `motorbicycle` 明確覆寫 `run()` 消除二義性。

修正

class motorbicycle : public mb, public mm {
public:
    void run() override {   // 必須覆寫
        // 可選擇呼叫 mb::run() 或 mm::run() 或自行實作
        mb::run(); // 或 mm::run()
    }
    void run1() { cout << "8888"; }
    void run2() { cout << "7777"; }
};

或在 `bicycle`/`motorcar` **不覆寫 `run()`**,保留虛基類實作,則底層無二義性(但失去多型意義)。

核心概念

  • 虛繼承解決**資料成員**重複(只有一份 `vihicle::i`)。
  • 虛函數覆寫在菱形繼承中若多條路徑都覆寫,**最底層必須再次覆寫**解決函數二義性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved