虛基類 `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()`**,保留虛基類實作,則底層無二義性(但失去多型意義)。