注意:本文中代碼均使用 Qt 開(kāi)發(fā)編譯環(huán)境
《虛基類(lèi)》
當(dāng)某類(lèi)的部分或者全部直接基類(lèi)是從另一個(gè)共同基類(lèi)派生而來(lái)時(shí)焦辅,在這些直接基類(lèi)中田篇,從上級(jí)共同基類(lèi)繼承來(lái)的成員就擁有相同的名稱(chēng)。在派生類(lèi)的對(duì)象中,這些同名數(shù)據(jù)成員在內(nèi)存中同時(shí)擁有多個(gè)拷貝,同一函數(shù)名會(huì)有多個(gè)映射陌选。我們可以用作用域分辨符來(lái)唯一標(biāo)識(shí)并分別訪問(wèn)它們。
也可以將共同的基類(lèi)設(shè)置為虛基類(lèi)蹄溉,這時(shí)從不同的路徑繼承過(guò)來(lái)的同名數(shù)據(jù)成員在內(nèi)存中就只有一個(gè)拷貝咨油,同一個(gè)函數(shù)名也只有一個(gè)映射。
語(yǔ)法:
class 派生類(lèi)名:virtual 繼承方式 基類(lèi)名
上述語(yǔ)句聲明基類(lèi)為派生類(lèi)的虛基類(lèi)柒爵。在多繼承情況下役电,虛基類(lèi)關(guān)鍵字的作用范圍和繼承方式關(guān)鍵字相同,只對(duì)緊跟其后的基類(lèi)起作用棉胀。聲明了虛基類(lèi)以后法瑟,虛基類(lèi)的成員在進(jìn)一步派生的過(guò)程中和派生類(lèi)一起維護(hù)同一個(gè)內(nèi)存數(shù)據(jù)拷貝。
舉例:
#include <QCoreApplication>
#include <QDebug>
class B0 {
public:
int nV;
void fun(){qDebug()<<"Memberof B0 and nV = "<<nV;}
};
class B1 : virtual public B0 {
public:
int nV1;
};
class B2 : virtual public B0 {
public:
int nV2;
};
class C : public B1, public B2 {
public:
int nVc;
void fun(){qDebug()<<"Memberof C";}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
C c1;
c1.B1::nV = 2;
c1.B1::fun();
c1.B2::nV = 3;
c1.B2::fun();
c1.B1::fun();
return a.exec();
}
運(yùn)行結(jié)果:
《虛基類(lèi)及其派生類(lèi)構(gòu)造函數(shù)》
如果虛基類(lèi)聲明有非默認(rèn)形式的(即帶形參的)構(gòu)造函數(shù)唁奢,并且沒(méi)有聲明默認(rèn)形式的構(gòu)造函數(shù)霎挟,這時(shí),在整個(gè)繼承關(guān)系中驮瞧,直接或者間接繼承虛基類(lèi)的所有派生類(lèi)氓扛,都必須在構(gòu)造函數(shù)的成員初始化表中列出對(duì)虛基類(lèi)的初始化枯芬。
例如论笔,示例:
#include <QCoreApplication>
#include <QDebug>
class B0 {
public:
B0(int n){nV = n;}
int nV;
void fun(){qDebug()<<"Memberof B0 and nV = "<<nV;}
};
class B1 : virtual public B0 {
public:
B1(int a):B0(a){}
int nV1;
};
class B2 : virtual public B0 {
public:
B2(int a):B0(a){}
int nV2;
};
class C : public B1, public B2 {
public:
C(int a):B0(a),B1(a),B2(a){}
int nVc;
void fun(){qDebug()<<"Memberof C";}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
C c1(1);
c1.B1::fun();
c1.B2::fun();
c1.fun();
c1.B1::nV = 2;
c1.B1::fun();
c1.B2::nV = 3;
c1.B2::fun();
c1.B1::fun();
return a.exec();
}
運(yùn)行結(jié)果: