虚函数继承
如果在父类中定义了虚函数 子类中没有同名的虚函数,那么子类公有继承父类时会把虚函数继承过去吗
如果在父类中定义了虚函数 子类中没有同名的虚函数,那么子类公有继承父类时会把虚函数继承过去吗
2015-12-28
父类函数如果是虚函数,子类的同名函数(参数也要相同哦)就一定是虚函数,子类的子类也一样
父类函数不是虚函数,子类同名函数是虚函数,编译是没有问题的,如果没有父类指针指向子类对象的操作也是没有问题的,但是有父类指针指向子类对象的操作时,操作的函数会是父类的函数,至此都没有什么问题,但是在父类的指针释放内存时,系统就会出问题。这时候如果子类还有孙子类,那么子类指针指向孙子类以及重孙子类,都会是覆盖,也就是调用同名函数的时候,执行的都是实际对象的函数实现。但是父类指针指向孙子类以及重孙子类与指向子类的效果是一样的。这是我 实测的结果,在delete父类指针时,内存无法释放,系统就出问题了。
我分析了一下,父类函数不是虚函数,在子类修饰为虚函数,这时候,父类的虚函数表中指向假设0x12345内存地址,子类的虚函数表也应该是指向0x12345,这样在实例化类的时候,由于父类中该函数是非virtual的,子类的指向也不会变,所以执行结果就是父类与子类的该函数执行父类的函数实现。父类指针指向孙子类的时候,孙子类的虚函数表由于子类声明为虚函数,就指向假设0x67890内存地址,由于父类的该函数是非virtual的,所以孙子类对象的该函数在虚函数表中要以父类的地址为准,而不会用0x67890覆盖掉父类的0x12345,所以执行结果仍是父类的实现。这时候子类指针指向孙子类的时候,就与咱学的一样喽,执行结果是孙子类的实现。
再来说一下释放内存出的问题,具体我还真分析不出来,不过如果父类的析构函数是虚析构函数的话,内存的释放也是没有问题的,所以我们其它的不管(不管业务是否有业务需要),析构函数最好都加上virtual关键字。对于如果有可能被继承的类,其函数最好都声明称虚函数,这样继承才有意义,才可以让你的逻辑在运行时决定使用哪个具体实现(多态)。virtual应该就是为了实现面向对象中的多态才诞生的吧
不用不好意思,学习哪不会说出来咱们一起讨论,吃透了,学会了才是我们的目的。
举报