对于那些使用vtables的编译器实现:是否有任何在运行时更改虚函数表的情况?或者vtable仅在编译时填充,并且在运行时不执行任何操作来修改它们?
答案 0 :(得分:8)
我不知道任何带有多态实现的C ++ ABI,它使用虚拟表在运行时更改。
无论如何,它不会非常有用,因为虚拟表通常描述代码的属性(成员函数彼此之间的关系以及类层次结构中的位置)并且C ++代码不会改变运行时。
因为它不会有用,所以会浪费。
答案 1 :(得分:3)
简短的回答是否定的。
稍微长一点(可能是特定于实现的)答案是,在执行派生多态类的构造函数和析构函数期间,对象指向实际vtable的指针会发生变化,因此派生类中的重写方法不会被执行
表示派生类尚未构造/已被破坏的基类的构造函数/析构函数。如果您希望对象在运行时更改类,那么您有许多选项:
目标c(++)
手动编码您自己的调度机制
python / javascript等al。
(最佳选择)重新考虑您的设计。