У меня есть следующий класс:
// 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()':
IVirtualController :: ~ IVirtualController ()»
test/input/InputManagerTest.cpp:19: undefined reference to
test / input / InputManagerTest.cpp: 19: неопределенная ссылка на `IVirtualController :: ~ IVirtualController () ‘test / input / InputManagerTest.o: в функции
IVirtualController::IVirtualController()':
vtable для IVirtualController’а
test/input/../../src/input/IVirtualController.hpp:14: undefined reference totest / input / InputManagerTest.o: в функции
MockController::MockController()':
IVirtualController :: ~ IVirtualController ()»
test/input/InputManagerTest.cpp:15: undefined reference totest / input / InputManagerTest.o :(. rodata._ZTI14MockController [_ZTI14MockController] + 0x10): неопределенная ссылка на `typeinfo для IVirtualController ‘
Поиск показал, что ошибки «неопределенная ссылка на vtable / typeinfo» вызваны отсутствием реализации, отсутствием «= 0» после объявления виртуального метода или не виртуальным деструктором.
Класс IVirtualController не реализован, но это не должно быть проблемой, так как MockController реализует его, верно? Закомментирование всего макета файла InputManagerTest.cpp «решает» проблему, даже если IVirtualController используется в другом классе.
Как мне это проверить?
Нету. Деструктор всегда должен быть реализован. Даже чисто виртуальный.
Это из-за того, как это работает. virtual
применяется к деструктору отличающийся больше смысла. Обычно virtual
метод не вызывается, если он переопределен в производном классе, но virtual
деструктор все равно будет вызываться, поэтому требуется реализация.
=0
поскольку деструктор только делает класс абстрактным, но, как уже было сказано, реализация все еще требуется.
Других решений пока нет …