运行时的Vtable修改

时间:2016-04-17 08:31:51

标签: c++ vtable

对于那些使用vtables的编译器实现:是否有任何在运行时更改虚函数表的情况?或者vtable仅在编译时填充,并且在运行时不执行任何操作来修改它们?

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

简短的回答是否定的。

稍微长一点(可能是特定于实现的)答案是,在执行派生多态类的构造函数和析构函数期间,对象指向实际vtable的指针会发生变化,因此派生类中的重写方法不会被执行

表示派生类尚未构造/已被破坏的基类的构造函数/析构函数。

如果您希望对象在运行时更改类,那么您有许多选项:

  1. 目标c(++)

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

  3. python / javascript等al。

  4. (最佳选择)重新考虑您的设计。