我有以下课程:
// 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.
我该如何测试?
不.必须始终实现析构函数.即使是纯虚拟的.
这是因为它的工作原理.virtual适用于析构函数不同的更多的意义.通常,如果virtual方法在派生类中被覆盖,则不会调用该方法,但virtual仍会调用析构函数,因此需要实现.
在=0一个析构函数只会使抽象类,但是,如前所述,实现仍然需要.