亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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

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

畢竟父類指向的是子類的內存,只能訪問到子類的函數,和繼承自父類的函數。


正在回答

3 回答

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

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

也就是說通過父類指針找普通成員函數時,雖然父類指針指向子類對象,通過父類指針只能訪問子類對象的數據成員(部分,父類獨有的),不能訪問子類對象的成員函數(與父類同名),如果想要訪問,只能將子類的成員函數變成虛函數,放進虛函數表中,這樣父類指針才可以優先找到虛函數表中的成員函數,但是這個成員函數是子類的;

0 回復 有任何疑惑可以回復我~
#1

淺夏流年 提問者

非常感謝!
2017-05-05 回復 有任何疑惑可以回復我~

當基類中的數據成員和成員函數與派生類的相同的時候,又因為派生類的成員是在父類之下的,所以在沒有虛函數的情況下,就會是先訪問父類的。如果有虛函數的時候,就要先考慮虛函數表了,因為父類的和子類的同名,子類中的虛函數的地址就會覆蓋住父類的,從而訪問的是子類的

0 回復 有任何疑惑可以回復我~

父類指針指向子類內存,應該是子類里的成員函數對父類進行了初始化吧,指針始終還是父類的,只是其成員可以由子類初始化,那么用該指針調用同名函數時自然調用的是被子類初始化了的父類成員函數了。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
C++遠征之多態篇
  • 參與學習       66224    人
  • 解答問題       334    個

本教程將帶領大家體會面向對象三大特性中的多態特性

進入課程

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

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號