在运行时重写C++虚拟函数

2020-08-09 17:20:26

一般来说,在运行时修改虚拟函数表可能不是伟大设计的标志,但如果您需要修复不能重新编译的代码,这可能会节省您的时间。至少它可以作为一种炫耀C++技能的方式。

如果您曾经发运过依赖于第三方库的大型软件,您可能知道这种情况。其中一个依赖项中存在错误,但您无法在那里修复它。您可能没有源代码,它可能是一个系统范围的库,或者您只是想避免修补它的麻烦。

那么,你能做什么呢?在Linux上,LD_PRELOAD是一个典型的答案。有一天我可能会回到那个问题上来,但是如果这个bug影响到很多平台怎么办?我甚至不知道如何在Windows上做同样的事情,而且特定于平台的DLL注入黑客也不是我想要投入生产的东西。

几年前,我们处于这种情况。有问题的库是用C++编写的。它提供了一个具有虚函数的基类,其在派生类中的实现在某些特殊情况下失败。大概是这样的: