在基类方法中调用不同类的方法

Call a method of a different class in base class method

本文关键字:同类 方法 调用 基类 类方法      更新时间:2023-10-16
#include <iostream>
using namespace std;
//can't modify it
class Orig{
public:
void Method(){
cout << "I am original method";
}
};
class Mock{
public:
void Method(){
cout << "I am  mock method";
}
};

//can't modify it
class UseMethod{
Orig object;
public:
void UseOrigMethod(){
object.Method();
}
};
class UseMethodMock : public UseMethod{
//some code
};
int main()
{
UseMethodMock o;
o.UseOrigMethod();
}

当我从 main 调用o.UseOrigMethod();时,我想使用上面的代码调用Mock类的Method()。我尝试在UseMethodMock中声明Mock类的object,但它仍然使用Orig的对象。

有什么方法可以欺骗编译器并在MockUseMethod类中调用object.Method()时调用Method

我可以更改Mock类和UseMethodMock类中的代码,但不能更改其他类中的代码。

修改代码以使其更易于测试并不可耻,所以也许你可以重新考虑。在这种情况下:

  1. 通过使Orig方法虚拟化来准备继承。
  2. 通过
  3. 构造函数将Orig实例注入到UseMethod中(注意切片 - 通过指针或引用传递(。
  4. Mock继承Orig并覆盖虚拟方法。

如果虚拟调用的性能是一个问题,请在编译时完成所有操作:

  1. 使UseMethod成为模板,该模板将Orig类型作为模板参数。
  2. 在生产代码中,使用UseMethod<Orig>.
  3. 在测试代码中,使用UseMethod<Mock>.

如果你真的,绝对,肯定可以肯定,肯定不能修改OrigUseMethod,你可以滥用预处理器:

#include "Orig.h"
#define Orig Mock
#include "UseMethod.h"
#undef Orig

当然,这伴随着一大堆警告(最值得注意的是,它假设UseMethod.cpp没有明确提到Orig类型(,总的来说,我强烈建议不要这样做。

因为你调用了 orig 的方法。你应该在UseMethodMock类中覆盖useOrigMethod((。

你只需要将UseMethod类Orig对象更改为Moke对象,我将给出预期的输出,这意味着称为Moke类的方法。

法典:

#include <iostream>
using namespace std;
//can't modify it
class Orig{
public:
void Method(){
cout << "I am original method";
}
};
class Mock{
public:
void Method(){
cout << "I am  mock method";
}
};

//can't modify it
class UseMethod{
//need to change here Orig to Moke
Mock object;
public:
void UseOrigMethod(){
object.Method();
}
};
class UseMethodMock : public UseMethod{
//some code
};
int main()
{
UseMethodMock o;
o.UseOrigMethod();
}

输出

I am  mock method
--------------------------------
Process exited after 0.006435 seconds with return value 0
Press any key to continue . . .