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

Dan*_*ner 0 c++ googlemock

我有以下课程:

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

现在我想模仿这个类:

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

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

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中

test/input/InputManagerTest.o:在函数MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference toIVirtualController ::〜IVirtualController()'中

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

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

我该如何测试?

Luc*_*ore 5

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

这是因为它的工作原理.virtual适用于析构函数不同的更多的意义.通常,如果virtual方法在派生类中被覆盖,则不会调用该方法,但virtual仍会调用析构函数,因此需要实现.

=0一个析构函数只会使抽象类,但是,如前所述,实现仍然需要.

  • 虚拟的dtors没有不同的含义,只是dtors隐含地称为子对象的dtors. (3认同)