虛基類
共同基類設定為虛基類,這樣從不同路徑繼承來的同名資料成員在記憶體中就隻有一個拷貝,同名函數也隻有一種映射
虛基類(virtual base class)定義方式如下:
class 派生類名:virtual 通路限定符 基類類名{...};
class 派生類名:通路限定符 virtual 基類類名{...};
virtual 關鍵字隻對緊随其後的基類名起作用:
class Student:virtual public Person
{
...
};
class Employee:virtual public Person
{
...
};
#include <iostream>
using namespace std;
class A
{
public:
int i;
void showa()
{
cout<<"i="<<i<<endl;
}
};
class B:virtual public A //此處采用虛繼承
{
public:
int j;
};
class C:virtual public A //此處采用虛繼承
{
public:
int k;
};
class D:public B,public C
{
public:
int m;
};
int main()
{
A a;
B b;
C c;
a.i=1;
a.showa();
b.i=2;
b.showa();
c.i=3;
c.showa();
D d;
d.i=4;
d.showa();
return 0;
}
運作結果:
i=1
i=2
i=3
i=4
Press any key to continue
從這個代碼我們可以看出B,C,D從A那裡繼承過來了i這個變量并且它們之間不會有任何影響,如果B和C不是虛繼承方式的,那麼d.i=4;就不能編譯通過了
多繼承時很容易産生命名沖突,即使我們很小心地将所有類中的成員變量和成員函數都命名為不同的名字,命名沖突依然有可能發生,比如非常經典的菱形繼承層次。如下圖所示:
類A派生出類B和類C,類D繼承自類B和類C,這個時候類A中的成員變量和成員函數繼承到類D中變成了兩份,一份來自 A-->B-->D 這一路,另一份來自 A-->C-->D 這一條路。
在一個派生類中保留間接基類的多份同名成員,雖然可以在不同的成員變量中分别存放不同的資料,但大多數情況下這是多餘的:因為保留多份成員變量不僅占用較多的存儲空間,還容易産生命名沖突,而且很少有這樣的需求。
為了解決這個問題,C++提供了虛基類,使得在派生類中隻保留間接基類的一份成員。