父類指針指向子類內存,為什么當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數?
父類指針指向子類內存,為什么當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數?
畢竟父類指向的是子類的內存,只能訪問到子類的函數,和繼承自父類的函數。
父類指針指向子類內存,為什么當父類的成員函數不加virtual時,訪問的還是父類的成員函數,而不是子類同名的成員函數?
畢竟父類指向的是子類的內存,只能訪問到子類的函數,和繼承自父類的函數。
2016-10-22
舉報
2017-04-05
我認為是這樣,類的成員函數都在代碼區,不同的類的成員函數在代碼區有自己的類名稱空間限制,類的虛函數在虛函數表中,程序執行的時候,是先在虛函數表中找該成員函數,如果沒有找到,就去該類在代碼區的成員函數中去找。
所以如果父類的成員函數加上virtual時,訪問的時候是先在虛函數表中查找,如果找到了,就執行,沒找到就再在該類的代碼區查找。所以父類普通的成員函數只能在父類的代碼區找到。
也就是說通過父類指針找普通成員函數時,雖然父類指針指向子類對象,通過父類指針只能訪問子類對象的數據成員(部分,父類獨有的),不能訪問子類對象的成員函數(與父類同名),如果想要訪問,只能將子類的成員函數變成虛函數,放進虛函數表中,這樣父類指針才可以優先找到虛函數表中的成員函數,但是這個成員函數是子類的;
2018-01-23
當基類中的數據成員和成員函數與派生類的相同的時候,又因為派生類的成員是在父類之下的,所以在沒有虛函數的情況下,就會是先訪問父類的。如果有虛函數的時候,就要先考慮虛函數表了,因為父類的和子類的同名,子類中的虛函數的地址就會覆蓋住父類的,從而訪問的是子類的
2016-10-23
父類指針指向子類內存,應該是子類里的成員函數對父類進行了初始化吧,指針始終還是父類的,只是其成員可以由子類初始化,那么用該指針調用同名函數時自然調用的是被子類初始化了的父類成員函數了。