c++ - 替换 C++ 基类方法?

标签 c++

我看过Is it possible to replace a method at runtime in C/C++? ,但我是一个 C++ 新手,所以还不知道它如何(以及是否)适用于我的案例,所以我想尝试用我的例子提问。

在下面的示例中,假设类 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 ; 而不是给定的 inval + 5;。因此,没有什么复杂的,但需要访问该方法的输入参数。

那么我有一个选项,定义一个新函数,比如:

int getNewBaseVal(int inval) {
  return inval + 6;
}

.. 然后以某种方式“替换”旧的 MyBase::getBaseVal:

  • 在类级别上(即 MyBase 将被“修补”),这样 A1A2 的所有后续实例将最终在调用它们的 getVal 时使用 getNewBaseVal
  • 在对象级别上,只有特定的实例化,例如 A1 作为对象(如 _a1)最终会使用 getNewBaseVal 当它的 getVal 被调用时;

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

最佳答案

总而言之,你做不到;至少,不在给定的限制范围内(这排除了各种次优的黑客攻击,例如 Andrey 的!)。

让库作者修复这个错误,同时构建你自己的 fork 和修复版本。

关于c++ - 替换 C++ 基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32870622/

相关文章:

c++ - 是否需要使用new关键字创建容器(集合, vector 等),以便在函数之间持久存在?

C++17:如何在并行 STL 中获取工作项的索引

c++ - 集合比较器的前向声明

c++ - OpenEXR 到 QImage 的转换

C++ Combinatorics 组合高性能函数

c++ - 关于工厂模式的问题

c++ - Operator=声明问题

c++ - 如果子类具有与父类相同的参数,子类是否应该覆盖构造函数?

php - QHttpMultiPart 上传多个文件

c++ - 更改在 makefile 中调用的编译器