运行时的Vtable修改

Vtable modifications at run time

本文关键字:修改 Vtable 运行时      更新时间:2023-10-16

对于那些使用vtables的编译器实现:是否存在在运行时更改虚拟函数表的情况?还是vtables只在编译时填充,而在运行时不执行任何操作来修改它们?

我不知道有任何C++ABI具有多态性实现,该实现使用在运行时更改的虚拟表。

无论如何,这并不是很有用,因为虚拟表通常描述代码的一个属性(成员函数在类层次结构中的位置彼此之间的关系),而C++代码在运行时不会改变。

因为它不会有用,所以会浪费。

简短的回答是否定的。

一个稍长的(可能是特定于实现的)答案是,在派生多态类的构造函数和析构函数的执行过程中,对象指向实际vtable的指针会发生变化,因此派生类中的重写方法不会在派生类尚未构造/已被析构函数时由基类的构造函数/析构函数执行。

如果你想让对象在运行时改变类,那么你有很多选择:

  1. objective-c(++)

  2. 手动编码您自己的调度机制

  3. python/javascript等。

  4. (最好的选择)重新考虑你的设计。