如何在没有实现的情况下测试纯虚拟类?

时间:2013-04-05 20:29:54

标签: c++ googlemock

我有以下课程:

// 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 to中IVirtualController :: ~IVirtualController()'   test / input / InputManagerTest.cpp:19:未定义的引用`IVirtualController :: ~IVirtualController()'

     

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

     

test / input / InputManagerTest.o:在函数MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference to IVirtualController :: ~IVirtualController()'

     

test / input / InputManagerTest.o :(。rodata._ZTI14MockController [_ZTI14MockController] + 0x10):未定义引用`typeinfo for IVirtualController'

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

我该如何测试?

1 个答案:

答案 0 :(得分:5)

不。必须始终实施析构函数 。即使是纯虚拟的。

这是因为它的运作方式。应用于析构函数的virtual使具有不同的更多含义。通常,如果virtual方法在派生类中被覆盖,则不会调用它,但仍会调用virtual析构函数,因此需要实现。

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