为了账号安全,请及时绑定邮箱和手机立即绑定

父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数?

父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数?

毕竟父类指向的是子类的内存,只能访问到子类的函数,和继承自父类的函数。


正在回答

3 回答

我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中去找。

所以如果父类的成员函数加上virtual时,访问的时候是先在虚函数表中查找,如果找到了,就执行,没找到就再在该类的代码区查找。所以父类普通的成员函数只能在父类的代码区找到。

也就是说通过父类指针找普通成员函数时,虽然父类指针指向子类对象,通过父类指针只能访问子类对象的数据成员(部分,父类独有的),不能访问子类对象的成员函数(与父类同名),如果想要访问,只能将子类的成员函数变成虚函数,放进虚函数表中,这样父类指针才可以优先找到虚函数表中的成员函数,但是这个成员函数是子类的;

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

浅夏流年 提问者

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

当基类中的数据成员和成员函数与派生类的相同的时候,又因为派生类的成员是在父类之下的,所以在没有虚函数的情况下,就会是先访问父类的。如果有虚函数的时候,就要先考虑虚函数表了,因为父类的和子类的同名,子类中的虚函数的地址就会覆盖住父类的,从而访问的是子类的

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

父类指针指向子类内存,应该是子类里的成员函数对父类进行了初始化吧,指针始终还是父类的,只是其成员可以由子类初始化,那么用该指针调用同名函数时自然调用的是被子类初始化了的父类成员函数了。

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

举报

0/150
提交
取消
C++远征之多态篇
  • 参与学习       66236    人
  • 解答问题       314    个

本教程将带领大家体会面向对象三大特性中的多态特性

进入课程

父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信