


C/C++培訓
達內IT學院
400-111-8989

C++程序優化,今天我來講講C++培訓課程中菱形繼承產生的問題及解決。
1.何為菱形繼承?
兩個子類繼承同一個父類,而又有子類又分別繼承這兩個子類,就如上圖說示:
View Code
產生的問題,會產生二義性問題,即對于baseClass的調用要說明作用域的情況:
D *pd=new D;
pd->B::a=1;
pd->C::a=2;
printf("%d\n",pd->B::a);
printf("%d\n",pd->C::a);
相當于baseClass在類中有兩個,這可能不是我們想要的結果,增加調用的困難,同時也會浪費內存資源。
這種結構如圖:
可以看到A指向的虛函數表的位置是不一樣的!即baseClass有兩個實例!
2.如何解決?
使用虛擬繼承!
View Code
內存布局:
對于baseClass是公用的,也就是baseClass就實例化了一個對象!想想這會有什么后果?調用B,C的虛函數的時候就一個虛表怎么行,所以有需要對應有兩個相應的虛表指向B,C,于是就成了上面的結構了。
調試觀察,果然如此!
總結:可以通過虛擬繼承消除二義性,但是虛擬繼承的開銷是增加虛函數指針。
填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!