【发布时间】:2020-04-24 03:46:25
【问题描述】:
在静态绑定中,要调用的方法是在编译时做出的,而在动态绑定中,要调用的方法是在运行时做出的。 使用动态绑定调用虚拟方法。 这意味着在编译阶段决定哪个是必须调用的虚拟表的函数指针。 作为一个函数指针,只不过是一个变量,它包含指向的函数的内存地址,并在编译时决定要调用哪个指针,在我看来,因此间接地决定了必须调用的方法在编译阶段。
所以我的问题是: 为什么说动态绑定是在执行过程中决定要调用的方法,而实际上在编译阶段就已经选择了虚拟表的入口?
【问题讨论】:
-
vtable 中的条目在编译时是已知的,但要查看的 vtable 仅在运行时才知道。
-
当编译器看到这个函数并且
bar是虚拟的时考虑void (Foo& f) { f.bar();},它无法在编译时决定调用什么函数 -
你不知道要看哪个表。
-
@Tony92,我真的不明白问题出在哪里。要调用虚方法,您必须间接调用
vptr[index],其中index在编译时已知,vptr在运行时已知。vptr[index]在概念上与*(vptr + index)相同。即使您在编译时知道一个术语,您也不知道总和。这就是为什么它是动态绑定,而不是静态的。 -
Take a look。例如,对第三个虚函数的调用转换为
call [rax+16],其中rax是vtbl 指针(由构造函数初始化的第一个“隐藏”数据成员),16是固定偏移量(= @987654332 @)。
标签: c++ binding polymorphism virtual-functions dynamic-binding