2013-04-05 58 views
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)); 
}; 

但是,这并不工作! 我得到以下错误:

测试/输入/ InputManagerTest.o:在功能MockController::~MockController()': test/input/InputManagerTest.cpp:19: undefined reference to IVirtualController ::〜IVirtualController()” 测试/输入/ InputManagerTest.cpp:19:未定义参考`IVirtualController :: 〜IVirtualController() '

测试/输入/ InputManagerTest.o:在功能IVirtualController::IVirtualController()': test/input/../../src/input/IVirtualController.hpp:14: undefined reference to虚函数表为IVirtualController'

测试/输入/ InputManagerTest.o:在功能MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference to IVirtualController ::〜IVirtualController()”

测试/输入/ InputManagerTest.o :(rodata._ZTI14MockController [_ZTI14MockController] + 0×10):未定义参考`所属类别为IVirtualController”

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

我该如何测试?

回答

5

没有。破坏者必须始终执行。即使是一个纯虚拟的。

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

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

+3

虚拟for dtors没有不同的含义,只是dtors隐式调用子对象的dtors。 – PlasmaHH 2013-04-05 20:37:20

+0

@PlasmaHH是的,我猜它有一些意义,但也增加了一些。 – 2013-04-05 20:49:50

相关问题