1. 程式人生 > >父類指針指向子類內存,為什麽當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數

父類指針指向子類內存,為什麽當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數

https 執行 子類 對象 類名 tail detail com 成員函數

我認為是這樣,類的成員函數都在代碼區,不同的類的成員函數在代碼區有自己的類名稱空間限制,類的虛函數在虛函數表中,程序執行的時候,是先在虛函數表中找該成員函數,如果沒有找到,就去該類在代碼區的成員函數中去找。

所以如果父類的成員函數加上virtual時,訪問的時候是先在虛函數表中查找,如果找到了,就執行,沒找到就再在該類的代碼區查找。所以父類普通的成員函數只能在父類的代碼區找到。

也就是說通過父類指針找普通成員函數時,雖然父類指針指向子類對象,通過父類指針只能訪問子類對象的數據成員(部分,父類獨有的),不能訪問子類對象的成員函數(與父類同名)。

如果想要訪問,只能將子類的成員函數變成虛函數,放進虛函數表中,這樣父類指針才可以優先找到虛函數表中的成員函數,但是這個成員函數是子類的;

https://www.imooc.com/qadetail/175405?t=399816

父類指針指向子類內存,為什麽當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數