当继承的时候,
虚函数表,应该已经出来了吧.
编译器应该很清楚全部父类和子类的虚函数的代码偏移地址.
所以类的虚函数表应该已经出来了啊.
唯一的就是对象创建的时候, 把指针 指向 虚函数表的线性地址.
编译后的汇编代码(子类的部分代码)
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的反射是运行时绑定.那种非强类型的方式,这个谁都没办法.
虚函数表,应该已经出来了吧.
编译器应该很清楚全部父类和子类的虚函数的代码偏移地址.
所以类的虚函数表应该已经出来了啊.
唯一的就是对象创建的时候, 把指针 指向 虚函数表的线性地址.
编译后的汇编代码(子类的部分代码)
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
运行时还是编译时是看你能否使用了多态,而不是看你能否有虚函数