我覺得在這里dominance翻譯成可見性更好勺择。
假如說在某繼承層次上的父類都有同名成員函數(shù),那么子類在調(diào)用的時候會直接使用距離自己最近的父類的成員函數(shù)帝蒿,這一點在虛擬繼承下同樣適用吊说,不過虛擬繼承不關(guān)注訪問權(quán)限控制局服。假如說父類A的同名函數(shù)是private的状植,但是它距離子類最近浊竟,A的父類B也有一個同名函數(shù),它是可訪問的津畸。這時候在不顯式指定哪個類的同名函數(shù)時會出現(xiàn)無法訪問的錯誤提示振定,因為訪問的是A的private成員函數(shù)。
同樣肉拓,在不同繼承路徑中出現(xiàn)同名函數(shù)后频,如不加以顯式指定也會出現(xiàn)歧義性。
下面來做個實驗帝簇。
在非虛擬繼承下是否會有訪問權(quán)限控制呢徘郭?就是在類的層次上找到最近的可用的成員函數(shù)。
在這個圖片中丧肴,grandson繼承自child残揉,child繼承自base,child中的display是private成員芋浮,下面看測試代碼以及運行結(jié)果:
由上圖可見抱环,在非虛擬繼承情況下,也是不關(guān)注訪問權(quán)限的纸巷,從而得知它不是虛擬繼承的專利镇草。
接下來再驗證一下非虛擬繼承下的歧義性問題。
下面來看結(jié)果:
由上圖可見非虛擬繼承下瘤旨,它也不關(guān)注訪問權(quán)限梯啤,也會出現(xiàn)歧義性的問題。
再來看看虛擬繼承下的情況存哲。
結(jié)果如下:
從結(jié)果來看因宇,它仍然不知道要訪問哪個類的display,甚至還不知道單一繼承路徑上的哪個display祟偷。
現(xiàn)在我把child中的display注釋掉察滑,再看。
還是最近父類的那個display修肠。
總而言之一句話贺辰,你調(diào)用的方式明確就好,即便是使用虛擬繼承也不一定就不產(chǎn)生歧義性嵌施,你還是要仔細(xì)的饲化。
再有,我懷疑C++ Primer Plus這里是應(yīng)該是寫錯了艰管。
應(yīng)該寫成B::q()滓侍。