对于那些使用vtables的编译器实现:是否有任何情况下虚拟函数表在运行时更改?或者vtable只在编译时被填充,并且在运行时没有执行修改它们的操作?在运行时修改Vtable
回答
我不是利用了虚拟表在运行时更改多态性的实现知悉任何C++ ABI的。无论如何,由于虚拟表通常描述代码的属性(成员函数与类层次结构中的每个其他w.r.t.位置的关系),并且C++代码在运行时不会更改,所以它不会非常有用。
而且因为它不会有用,这将是浪费。
是否虚函数表走在execurable图像中的代码段或数据段? –
@KarolisM ilieška:在哪些实施?你为什么需要知道? –
具体:ARM Keil,但这也适用于gcc arm。 1.我只是很好奇,2.我使用嵌入式系统,有时需要知道在哪里放置某些部分。 –
简短的回答是否定的。
稍微长一点(也可能是特定于实现的)答案是,对象的实际vtable指针在派生多态类的构造函数和析构函数的执行过程中发生变化,因此派生类中的重写方法无法执行通过基类的构造函数/析构函数,而派生类尚未构造/已被破坏。
如果你希望对象在运行时更改类,那么你有多种选择:
的Objective-C(++)
手工编写自己的调度机制
python/javascript等等。
(最好的选择)重新考虑你的设计。
这不是变化的vtable。这是破坏对象的vptr成员! –
另外,'std :: function'可以在运行时重新分配,所以这是另一个选项 –
@KerrekSB固定,虽然我确定有更好的措辞 –
- 1. 在运行时修改
- 2. 在运行时修改propertyGrid
- 3. 在运行时修改persistence.xml
- 4. 在运行时修改persistence.xml
- 5. 运行时修改strings.xml
- 6. PHP运行时类修改
- 7. 在运行时创建jrxml文件并在运行时修改
- 8. 在运行时创建/修改枚举
- 9. 在运行时修改innerhtml属性
- 10. 在运行时修改simulink模型
- 11. 在运行时修改actionBar的外观
- 12. 在运行时动态修改块
- 13. 在运行时扩展/修改NHibernate类
- 14. ItemsControl的在运行时修改
- 15. PHP在运行时修改suhosin设置
- 16. 在运行时修改导轨模型
- 17. 在运行时修改字体
- 18. 在运行时修改程序集?
- 19. 在运行时修改向量
- 20. 修改的ListView的ItemTemplate在运行时
- 21. 在运行时修改JVM标志
- 22. 在运行时修改JVM参数
- 23. 在运行时修改.resx文件
- 24. C++在运行时修改资源
- 25. 重写或修改在运行时
- 26. 在Django运行时修改urlpatterns
- 27. 如何在运行时修改.code段?
- 28. 在运行时修改视图
- 29. 在运行时修改材质
- 30. 在运行时修改CABasicAnimation的setvalue?
你设想什么的运行时类型的修改是有用/可能吗? –
@ Cheersandhth.-Alf如果它是一个简单的C++程序比没有,这是愚蠢的。但如果他(现在或将来)必须写VM或interperter/JIT编译器之类的东西,那么我就不会如此迅速地抛弃他的问题 –
这是imp ...很难想出这样的设计,线程安全,所以没有完成。 –