我对虚拟表有一个小疑问,每当编译器遇到类中的虚拟函数时,它都会创建Vtable并将虚拟函数地址放在那里。对于其他继承的类,也会发生类似的情况。它是否在每个类中创建一个指向每个 Vtable 的新指针?如果不是,当创建派生类的新实例并将其分配给 Base PTR 时,它如何访问虚拟函数?
每次你创建一个包含虚函数的类,或者你
从包含虚函数的类派生,编译器
为该类创建一个唯一的 VTABLE。
如果你
不要重写在基类中声明为虚拟的函数,
编译器使用基类版本的地址
派生类。
然后将 VPTR 放入
班上。使用简单时,每个对象只有一个 VPTR
继承。 VPTR 必须初始化为指向
相应 VTABLE 的起始地址。 (这发生在
构造函数。)
一旦 VPTR 被初始化为正确的 VTABLE,对象
效果“知道”它是什么类型。但这种自知之明毫无价值
除非在调用虚函数时使用它。
当您通过基类地址调用虚函数时(
当编译器没有所有信息时的情况
执行早期绑定所必需的),一些特殊的事情发生了。
而不是执行典型的函数调用,这只是一个
汇编语言 CALL 到特定地址,编译器
生成不同的代码来执行函数调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)