深入浅出虚函数
今天写了难啃的知识点,我把它剥开剖析了一下,哎呦还不错哦,死结打开了。
1 虚函数是什么呢?
说白了就是前面加了virtual的函数。大多都在父类(叫基类也可)里面声明。它存在的意义就是给继承我的子类们留下无限的想象力来完善或完全开发这个功能。
上面这个“ 完善呢”是针对纯虚的函数,也就是非虚函数,在父类里面加了一点点实现,剩下的大部分等着“儿子或孙子”去实现(嘿嘿)。
那我上面说的这个“完全开发呢”就是针对这个纯虚函数了,纯虚函数里面是一丁点实现也不写啊,直接就声明为0。其实呢纯虚函数就是给以后设计众多子类或孙子类的程序员们一个信号:“这个功能要去做哦,但目前我不知道怎么做,但是我就是预测以后会有漏洞和隐患,子孙们要好好思考去做这个功能哦”。
2 再说说我一直不太好理解的这个 A *a = new B();a->run()到底调用的哪一个run()呢?
我们需要的知识点是:
创建一个父类对象,编译器就给把虚表指针指向了父类的虚函数,同样的,子类对象创建时就把虚表指针指向了子类的虚函数(只不过这个虚表指针来自于父类)(还要记得编译器是再对象构造时候就已经把虚表指针指向了各自的虚函数)。来梳理一下A *a = new B():
new B(),子类对象创建,开辟一块内存,把地址本该赋给子类B类对象指针现在赋给了父类a指针,转换了类型,a->run()直接跳到了B内存里的第一个位置“B类的虚表指针”去运行B类的虚函数run()。
再进一步消化一下啦:A *a = new B();a->run();
第一步: 把B类对象的内存地址赋给a。
第二步: 程序直接跳到B对象内存的第一个位置(虚表指针),跟着虚表指针来到B类的虚函数运行run()函数,真正的实现了多态。
我的其他文章在这里哦 程序员面试必备宝典-《剑指offer》“找出数组中重复数字 ” 完整代码+思路总结(c++实现)
转载地址:https://editor.csdn.net/md/?articleId=105110060