我见过Is it possible to replace a method at runtime in C/C++?,但我是一个C ++新手,所以还不知道它是如何(以及如果)适用于我的情况,所以我想尝试用我的例子。< / p>
在下面的示例中,假设类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;
而不是给定{{1} }}。所以,没有什么复杂的,但是需要访问该方法的输入参数。
所以我有一个选项来定义一个新功能,比如说:
inval + 5;
..然后以某种方式“替换”旧的int getNewBaseVal(int inval) {
return inval + 6;
}
:
MyBase::getBaseVal
将被“修补”),以便MyBase
和A1
的所有后续实例化最终将使用A2
时他们的getNewBaseVal
被称为getVal
作为对象(如A1
)的特定实例化最终会在其_a1
为getNewBaseVal
时使用getVal
叫; ...在main
函数的开头写一些代码?
答案 0 :(得分:4)
它的长短是你无法做到的;至少,不在给定的限制范围内(排除各种次优的黑客攻击,例如安德烈的!)。
让图书馆作者修复错误,并在此期间构建自己的分叉和修复版本。
答案 1 :(得分:0)
我建议您创建一个适配器类,并将其用作In [114]: %timeit [d.get(x.item()) for x in indices]
1000 loops, best of 3: 417 µs per loop
In [115]: %timeit vecdget(indices)
1000 loops, best of 3: 331 µs per loop
In [116]: %timeit [d.get(x.item()) for x in indices]
1000 loops, best of 3: 354 µs per loop
In [117]: %timeit vecdget(indices)
1000 loops, best of 3: 262 µs per loop
和A
的基类
B
但是修好图书馆会更好。