C++ 虛基類
教科書上面對C++虛基類的描述玄而又玄,名曰“共享繼承”,名曰“各派生類的物件共享基類的的一個拷貝”,其實說白了就是解決多重多級繼承造成的二義性問題。例如有基類B,從B派生出C和D,然後類F又同時繼承了C和D,現在類F的一個物件裡面包含了兩個基類B的物件,如果F訪問自己的從基類B那裡繼承過來的的資料成員或者函式成員那麼編譯器就不知道你指的到底是從C那裡繼承過來的B物件呢還是從D那裡繼承過來的B物件。
於是虛基類誕生了,將C和D的繼承方式改為虛繼承,那麼F訪問自己從B那裡繼承過來的成員就不會有二義性問題了,也就是將F物件裡的B物件統一為一個,只有一個基類B物件,下面是一段程式碼說明了對虛基類的使用。
#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();
//cout << "Hello world!" << endl;
return 0;
}
從這個程式碼我們可以看出B,C,D從A那裡繼承過來了i這個變數並且它們之間不會有任何影響,如果B和C不是虛繼承方式的,那麼d.i=4;就不能編譯通過了。