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

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

// 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 для 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 для IVirtualController ‘

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

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

0

Решение

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]