Как протестировать чисто виртуальный класс без реализации?

У меня есть следующий класс:

// 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 toIVirtualController::~IVirtualController()' test/input/InputManagerTest.cpp:19: неопределенная ссылка на `IVirtualController::~IVirtualController()'

test/input/InputManagerTest.o: В функции IVirtualController::IVirtualController()': test/input/../../src/input/IVirtualController.hpp:14: undefined reference tovtable для IVirtualController'

test/input/InputManagerTest.o: В функции MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference toIVirtualController::~IVirtualController()'

test/input/InputManagerTest.o:(.rodata._ZTI14MockController[_ZTI14MockController]+0x10): неопределенная ссылка на `typeinfo для IVirtualController'

Поиск сказал мне, что ошибки «неопределенная ссылка на vtable/typeinfo» вызваны отсутствующей реализацией, отсутствующим «= 0» за объявлением виртуального метода или не виртуальным деструктором. Класс IVirtualController не реализован, но это не должно быть проблемой, поскольку его реализует MockController, верно? Комментирование всего фиктивного файла InputManagerTest.cpp «решает» проблему, несмотря на то, что IVirtualController используется в другом классе.

Как мне это проверить?


person Daniel Ziltener    schedule 05.04.2013    source источник


Ответы (1)


Неа. Деструктор должен быть реализован всегда. Даже чисто виртуальный.

Это из-за того, как это работает. virtual, примененный к деструктору, имеет другое значение. Обычно метод virtual не вызывается, если он переопределен в производном классе, но деструктор virtual все равно вызывается, поэтому требуется реализация.

=0 для деструктора только делает класс абстрактным, но, как было сказано ранее, реализация по-прежнему требуется.

person Luchian Grigore    schedule 05.04.2013
comment
virtual for dtors не имеет другого значения, просто dtors неявно вызывают dtors подобъектов. - person PlasmaHH; 06.04.2013
comment
@PlasmaHH да, я думаю, это имеет какое-то общее значение, но также и добавляет кое-что. - person Luchian Grigore; 06.04.2013