我有以下课程:
// 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。
我该如何测试?
答案 0 :(得分:5)
不。必须始终实施析构函数 。即使是纯虚拟的。
这是因为它的运作方式。应用于析构函数的virtual
使具有不同的更多含义。通常,如果virtual
方法在派生类中被覆盖,则不会调用它,但仍会调用virtual
析构函数,因此需要实现。
析构函数的=0
只会使类成为抽象,但如前所述,仍然需要实现。