我看过Is it possible to replace a method at runtime in C/C++? ,但我是一个 C++ 新手,所以还不知道它如何(以及是否)适用于我的案例,所以我想尝试用我的例子提问。
在下面的示例中,假设类 MyBase
、A1
和 A2
来自某个库,我正在使用它们我的 main
:
// g++ -std=c++11 -o test.exe test.cpp
#include <iostream>
using namespace std;
class MyBase {
public:
MyBase() { }
~MyBase() { }
int getBaseVal(int inval) {
return inval + 5;
}
};
class A1 : public MyBase {
public:
A1() : MyBase() { }
~A1() { }
int getVal(int inval) {
return getBaseVal(inval) + 10;
}
};
class A2 : public A1 {
public:
A2() : A1() { }
~A2() { }
int getVal(int inval) {
return getBaseVal(inval) + 20;
}
};
int main() {
A1 _a1 = A1(); A2 _a2 = A2();
cout << "A1 for 10: " << _a1.getVal(10) << endl;
cout << "A2 for 10: " << _a2.getVal(10) << endl;
return 0;
}
现在,假设我想保持这个库不变,但我在 MyBase::getBaseVal
中发现了一个错误,返回的正确值应该是 inval + 6 ;
而不是给定的 inval + 5;
。因此,没有什么复杂的,但需要访问该方法的输入参数。
那么我有一个选项,定义一个新函数,比如:
int getNewBaseVal(int inval) {
return inval + 6;
}
.. 然后以某种方式“替换”旧的 MyBase::getBaseVal
:
- 在类级别上(即
MyBase
将被“修补”),这样A1
和A2
的所有后续实例将最终在调用它们的getVal
时使用getNewBaseVal
; - 在对象级别上,只有特定的实例化,例如
A1
作为对象(如_a1
)最终会使用getNewBaseVal
当它的getVal
被调用时;
...通过在 main
函数的开头编写一些代码?
最佳答案
总而言之,你做不到;至少,不在给定的限制范围内(这排除了各种次优的黑客攻击,例如 Andrey 的!)。
让库作者修复这个错误,同时构建你自己的 fork 和修复版本。
关于c++ - 替换 C++ 基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32870622/