0

我有以下课程:

// IVirtualController.hpp
class IVirtualController
{
public:
  virtual InputCode validate(int keycode) = 0;
  virtual ~IVirtualController();
};

现在我想模拟这个类:

// InputManagerTest.cpp
class MockController : public IVirtualController
{
public:
  MOCK_METHOD1(validate,InputCode(int keycode));
};

但这不起作用!我收到以下错误:

test/input/InputManagerTest.o:在函数MockController::~MockController()': test/input/InputManagerTest.cpp:19: undefined reference toIVirtualController::~IVirtualController()' 中 test/input/InputManagerTest.cpp:19:未定义对 `IVirtualController::~IVirtualController()' 的引用

test/input/InputManagerTest.o:在IVirtualController::IVirtualController()': test/input/../../src/input/IVirtualController.hpp:14: undefined reference toIVirtualController 的函数 vtable 中

测试/输入/InputManagerTest.o:在函数MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference toIVirtualController::~IVirtualController()'

测试/输入/InputManagerTest.o:(.rodata._ZTI14MockController[_ZTI14MockController]+0x10): 未定义对“IVirtualController 的类型信息”的引用

搜索告诉我“未定义对 vtable/typeinfo 的引用”错误是由缺少实现、虚拟方法声明后面缺少“= 0”或非虚拟析构函数引起的。IVirtualController 类没有实现,但这应该不是问题,因为 MockController 正在实现它,对吧?注释掉整个 InputManagerTest.cpp 模拟文件“解决”了这个问题,即使 IVirtualController 在另一个类中使用。

我该如何测试它?

4

1 回答 1

5

没有。必须始终实现析构函数。甚至是纯虚拟的。

那是因为它是如何工作的。virtual应用于析构函数持有不同的更多的意义。通常,virtual如果在派生类中重写了方法,则不会调用该方法,但virtual仍会调用析构函数,因此需要实现。

for 析构函数只使=0类抽象,但如前所述,仍然需要实现。

于 2013-04-05T20:30:40.183 回答