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

虚函数继承

如果在父类中定义了虚函数 子类中没有同名的虚函数,那么子类公有继承父类时会把虚函数继承过去吗

正在回答

2 回答

不一定,如果是private权限的,就不会,其它情况会,这样就算不是虚函数也是一样的。

子类继承父类,在创建类的时候就会有一个虚函数表的概念,如果子类没重写同名函数,子类的虚函数表关于该函数的入口地址就会指向父类的该函数的代码入口地址

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

qq_圓圓_0 提问者

首先,再次谢谢你! 还想再多问一些 ! 非private的权限下: 1.父类中用virtual修饰f1(),子类中不用virtual修饰f1()(同名、只声明、不定义),子类的方法一是不是会默认是有virtual修饰的 2.父类中不用virtual修饰f1(),而在子类中用virtual修饰f1()(同名、只声明、不定义),这种写法被允许吗 3.感觉不太好意思,就是对 只声明,不定义,算不算是重写 有点疑惑
2015-12-29 回复 有任何疑惑可以回复我~
  1. 父类函数如果是虚函数,子类的同名函数(参数也要相同哦)就一定是虚函数,子类的子类也一样

  2. 父类函数不是虚函数,子类同名函数是虚函数,编译是没有问题的,如果没有父类指针指向子类对象的操作也是没有问题的,但是有父类指针指向子类对象的操作时,操作的函数会是父类的函数,至此都没有什么问题,但是在父类的指针释放内存时,系统就会出问题。这时候如果子类还有孙子类,那么子类指针指向孙子类以及重孙子类,都会是覆盖,也就是调用同名函数的时候,执行的都是实际对象的函数实现。但是父类指针指向孙子类以及重孙子类与指向子类的效果是一样的。这是我 实测的结果,在delete父类指针时,内存无法释放,系统就出问题了。

    我分析了一下,父类函数不是虚函数,在子类修饰为虚函数,这时候,父类的虚函数表中指向假设0x12345内存地址,子类的虚函数表也应该是指向0x12345,这样在实例化类的时候,由于父类中该函数是非virtual的,子类的指向也不会变,所以执行结果就是父类与子类的该函数执行父类的函数实现。父类指针指向孙子类的时候,孙子类的虚函数表由于子类声明为虚函数,就指向假设0x67890内存地址,由于父类的该函数是非virtual的,所以孙子类对象的该函数在虚函数表中要以父类的地址为准,而不会用0x67890覆盖掉父类的0x12345,所以执行结果仍是父类的实现。这时候子类指针指向孙子类的时候,就与咱学的一样喽,执行结果是孙子类的实现。

    再来说一下释放内存出的问题,具体我还真分析不出来,不过如果父类的析构函数是虚析构函数的话,内存的释放也是没有问题的,所以我们其它的不管(不管业务是否有业务需要),析构函数最好都加上virtual关键字。对于如果有可能被继承的类,其函数最好都声明称虚函数,这样继承才有意义,才可以让你的逻辑在运行时决定使用哪个具体实现(多态)。virtual应该就是为了实现面向对象中的多态才诞生的吧

  3. 不用不好意思,学习哪不会说出来咱们一起讨论,吃透了,学会了才是我们的目的。


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

qq_圓圓_0 提问者

辛苦了,谢谢! 是不是可以理解为,父类指针指向子类对象,调用函数的时候都是调用父类函数,而virtual就是为了反其道(父类调用父类)而行,virtual就是为了实现多态才诞生的!
2015-12-31 回复 有任何疑惑可以回复我~
#2

太阳雨下 回复 qq_圓圓_0 提问者

我的理解是的,呵呵
2016-01-01 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

虚函数继承

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