瞎扯一段,講得不一定對。純屬學習!
struct BB
{
void a(){
cout << "bb's a()\n";
}
};
struct B1 : public BB
{
};
struct B2 : public BB
{
};
struct CC : virtual public B1,public B2
{
CC()
{
a(); // 調用a函數,編譯不過,需這樣調B1::a();B2::a();BB::a();
}
};
在上述代碼中,struct CC的構造裡調用a()函數會產生所謂的二義性。好吧,事實就是這樣。在此瞎扯一段,在這個實例裡,如果編譯器足夠聰明,這裡本不該產生二義性才對。因為這個函數並沒有什麼“真正的繼承”問題,B1和B2裡也沒有覆蓋定義a()函數。如果覆蓋了,調用時要加限定符,不然會產生二義性,這我還能理解。但僅是這個例子中,假設編譯器允許它編譯成功,真的會有二義性嗎?會產生調用錯誤嗎?我覺得沒有。所以我瞎講一下,編譯器有偷懶嫌疑。現在的編程都是朝著越來越精簡的方向走了,沒有用的語法限制只會帶來麻煩。好吧,以前幾乎不用多繼承,我一直憑直覺以為這種情況下直接調a()不會有問題,現在漲下知識。以上就是粗略見解,講得不好不對請原諒!