當在多條繼承路徑上有一個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個實例(或多個副本),若只想保存這個基類的一個實例,可以將這個公共基類說明為虛基類。
在繼承中產生歧義的原因有可能是繼承類繼承了基類多次,如圖,子類C最後會接受分別來自A和B的同一個或多個相同拷貝,從而產生了多個拷貝,即不止一次的通過多個路徑繼承類在記憶體中創建了基類成員的多份拷貝。而這些是A和B從父類繼承而來,所以C類該繼承A還是B傳下來的還是都接受呢?這樣就產生歧義,虛基類的基本原則是在記憶體中只有基類成員的一份拷貝。這樣,通過把基類繼承聲明為虛擬的,就只能繼承基類的一份拷貝,從而消除歧義。用virtual限定符把基類繼承說明為虛擬的。
基本介紹
- 中文名:虛基類
- 繼承:類繼承了基類多次
- 產生:多個拷貝
- 原則是:在記憶體中只有基類成員的一份拷貝
概述
初始化
C++
class derive:virtual public base{};
#include <iostream>using namespace std;class B0// 聲明為基類B0{ int nv;//默認為私有成員public://外部接口 B0(int n){ nv = n; cout << "Member of B0" << endl; }//B0類的構造函式 void fun(){ cout << "fun of B0" << endl; }};class B1 :virtual public B0{ int nv1;public: B1(int a) :B0(a){ cout << "Member of B1" << endl; }};class B2 :virtual public B0{ int nv2;public: B2(int a) :B0(a){ cout << "Member of B2" << endl; }};class D1 :public B1, public B2{ int nvd;public: D1(int a) :B0(a), B1(a), B2(a){ cout << "Member of D1" << endl; }// 此行的含義,參考下邊的 “使用注意5” void fund(){ cout << "fun of D1" << endl; }};int main(void){ D1 d1(1); d1.fund(); d1.fun(); return 0;}