C++ 速查手冊
9.20 - 虛擬繼承
若 Demo4 類別繼承自 Demo3 及 Demo2 , Demo3 及 Demo2 又同時繼承自 Demo ,此時 Demo3 及 Demo2 將會同時擁有 Demo 的成員,此時若 Demo4 的物件呼叫原屬於 Demo 的成員會產生一個問題,這個問題就是到底呼叫的是 Demo3 還是 Demo2 的部份?
要解決這問題就是同時在 Demo3 及 Demo2 繼承的 Demo 宣告為 virtual ,舉例如下
#include <iostream>
class Demo {
public:
Demo() {
a = 1;
b = 1;
}
int do_something() {
return a + b;
}
protected:
int a;
int b;
};
class Demo2: virtual public Demo {};
class Demo3: virtual public Demo {};
class Demo4: public Demo2, public Demo3 {};
int main() {
Demo4 d;
std::cout << d.do_something() << std::endl;
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:u0920.cpp
功能:示範 C++ 的類別
作者:張凱慶*/
virtual 放在冒號後的 Demo 前
class Demo2: virtual public Demo {};
class Demo3: virtual public Demo {};
編譯執行,結果如下
$ g++ u0920.cpp |
$ ./a.out |
2 |
$ |
相關教學影片