什麼是 C++ 中的虛基類?


當派生類具有基類的多個副本時,將使用虛基類。

示例程式碼

#include <iostream>
using namespace std;
class B {
   public: int b;
};

class D1 : public B {
   public: int d1;
};

class D2 : public B {
   public: int d2;
};

class D3 : public D1, public D2 {
   public: int d3;
};

int main() {
   D3 obj;

   obj.b = 40; //Statement 1, error will occur
   obj.b = 30; //statement 2, error will occur
   obj.d1 = 60;
   obj.d2 = 70;
   obj.d3 = 80;

   cout<< "\n B : "<< obj.b
   cout<< "\n D1 : "<< obj.d1;
   cout<< "\n D2: "<< obj.d2;
   cout<< "\n D3: "<< obj.d3;
}

在上面的示例中,D1 和 D2 都繼承了 B,它們都具有 B 的副本。但是,D3 同時繼承了 D1 和 D2,因此 D3 具有兩個 B 的副本,一個來自 D1,另一個來自 D2。

上面示例中的語句 1 和 2 將生成錯誤,因為編譯器無法區分 D3 中 b 的兩個副本。

要從 D3 中移除 B 的多個副本,我們必須在 D1 和 D3 中將 B 繼承為虛擬類。

因此,使用虛基類的上面示例將為 -

示例程式碼

 即時演示

#include<iostream>
using namespace std;
class B {
   public: int b;
};

class D1 : virtual public B {
   public: int d1;
};

class D2 : virtual public B {
   public: int d2;
};

class D3 : public D1, public D2 {
   public: int d3;
};

int main() {
   D3 obj;

   obj.b = 40; // statement 3
   obj.b = 30; // statement 4

   obj.d1 = 60;
   obj.d2 = 70;
   obj.d3 = 80;

   cout<< "\n B : "<< obj.b;
   cout<< "\n D1 : "<< obj.d1;
   cout<< "\n D2 : "<< obj.d2;
   cout<< "\n D3 : "<< obj.d3;
}

輸出

B : 30
D1 : 60
D2 : 70
D3 : 80

現在,D3 只具有 B 的一個副本,並且語句 4 將覆蓋語句 3 中給出的 b 的值。

更新於:2019 年 7 月 30 日

2K+ 閱讀量

開啟您的 職業

完成課程以獲得認證

開始
廣告
© . All rights reserved.