實(shí)際結(jié)構(gòu)是這樣的:
所以我們應(yīng)該這樣寫main函數(shù):
void main()
{
grandson gs;
gs.derived1::b = 1;
gs.derived2::b = 1;
gs.derived1::print();
gs.derived2::print();
}
可以看到,從基類base繼承來的成員b和print()函數(shù)在grandson中都有兩份,這可不是我們想要的!因?yàn)檫@兩個(gè)b是一樣的,都是從base來的;print()也是!
其實(shí),這個(gè)問題很好解決,科學(xué)家發(fā)明了關(guān)鍵字virtual來解決這個(gè)問題:
class base
{
public:
int b;
void print(){cout 《 "base" 《 endl;}
};
class derived1 : virtual public base
{
public:
int d1;
};
class derived2 : virtual public base
{
public:
int d2;
};
class grandson : public derived1,public derived2
{
public:
int g;
};
現(xiàn)在我們可以這樣寫主函數(shù)了:
void main()
{
grandson gs;
gs.b = 1;
gs.base::b = 1;
// gs.derived1::b = 1;
// gs.derived2::b = 1;
gs.print();
// gs.derived1::print();
// gs.derived2::print();
}
現(xiàn)在,grandson的b和print都只有一份了,所以編譯器不會再告訴我們“ambiguous”了!
當(dāng)然,按我加注釋那幾句那么寫也沒問題,反正現(xiàn)在b和print()都是各占一份內(nèi)存空間,不再分derived1和derived2繼承過來的,是從他們兩個(gè)共同從base繼承過來的。
請注意,對于base,我們什么也沒做,他現(xiàn)在就叫做虛基類,因?yàn)閐erived1和derived2在繼承時(shí)加了關(guān)鍵字virtual!
在現(xiàn)實(shí)世界中這種情況是很多見的,比如公司的臨時(shí)銷售人員,又有銷售人員的屬性,也有臨時(shí)人員的屬性;還有中國老師上課常用的老師和研究生派生的助教的例子,等等。
總之,你只要記。寒(dāng)你想實(shí)現(xiàn)棱形結(jié)構(gòu)時(shí),請使用virtual!
相關(guān)推薦:等考C++備考之如何學(xué)習(xí)C++與面向?qū)ο螅航M合北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |