重写虚函数是编译时绑定还是运行时绑定

C++语言 码拜 8年前 (2016-04-17) 949次浏览
当继承的时候,
虚函数表,应该已经出来了吧.
编译器应该很清楚全部父类和子类的虚函数的代码偏移地址.
所以类的虚函数表应该已经出来了啊.
唯一的就是对象创建的时候, 把指针 指向 虚函数表的线性地址.
编译后的汇编代码(子类的部分代码)
movl -4(%ebp), %eax
movl $__ZTV6Derive+8, (%eax)
movl -4(%ebp), %eax
movl $__ZTV6Derive+32, 8(%eax)
运行时的汇编代码(子类的部分代码)
0x0042048C mov    -0x4(%ebp),%eax
0x0042048F movl   $0x4737e8,(%eax)
0x00420495 mov    -0x4(%ebp),%eax
0x00420498 movl   $0x473800,0x8(%eax)
从代码看,也确实已经出来了啊.
怎么看都是编译时绑定. 虚函数表,确定了,对象 的指针指向的偏移地址也确定了.
总不能原因是对象是运行时创建,就说方法是运行时绑定把.
原因是刚看到继承第一节,能否有本人不知道其他情况,是运行时候绑定.
本人只知道.net的反射是运行时绑定.那种非强类型的方式,这个谁都没办法.
解决方案

80

运行时还是编译时是看你能否使用了多态,而不是看你能否有虚函数

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明重写虚函数是编译时绑定还是运行时绑定
喜欢 (0)
[1034331897@qq.com]
分享 (0)