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