替换C ++基类方法?

时间:2015-09-30 15:56:36

标签: c++

我见过Is it possible to replace a method at runtime in C/C++?,但我是一个C ++新手,所以还不知道它是如何(以及如果)适用于我的情况,所以我想尝试用我的例子。< / p>

在下面的示例中,假设类MyBaseA1A2来自某个库,我在我的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将被“修补”),以便MyBaseA1的所有后续实例化最终将使用A2时他们的getNewBaseVal被称为
  • 在对象级别上,只有getVal作为对象(如A1)的特定实例化最终会在其_a1getNewBaseVal时使用getVal叫;

...在main函数的开头写一些代码?

2 个答案:

答案 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

但是修好图书馆会更好。