對於那些使用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 ...很難想出這樣的設計,線程安全,所以沒有完成。 –