C++ 速查手冊

9.20 - 虛擬繼承

Demo4 類別繼承Demo3Demo2Demo3Demo2 又同時繼承自 Demo ,此時 Demo3Demo2 將會同時擁有 Demo 的成員,此時若 Demo4 的物件呼叫原屬於 Demo 的成員會產生一個問題,這個問題就是到底呼叫的是 Demo3 還是 Demo2 的部份?

要解決這問題就是同時在 Demo3Demo2 繼承的 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;
}

/* 《程式語言教學誌》的範例程式
   https://kaiching.org/
   檔名:u0920.cpp
   功能:示範 C++ 的類別
   作者:張凱慶*/

virtual 放在冒號後的 Demo

class Demo2: virtual public Demo {};
class Demo3: virtual public Demo {};

編譯執行,結果如下

$ g++ u0920.cpp
$ ./a.out
2
$

上一頁 9.19 - virtual 函數
回 C++ 速查手冊首頁
下一頁 單元 10 - 樣板
回 C++ 教材
回程式語言教材首頁