Проблема в том, что ваш исходный класс имеет эту виртуальную функцию:
virtual void encode(Packet* packet) = 0;
Тогда ваш унаследованный класс имеет следующее:
virtual void encode(T *packet) = 0;
Это две разные виртуальные функции.
Итак, когда вы делаете:
void encode(ProxyJoinPacket *packet) override {
Вы переопределяете метод только в том случае, если он унаследовал класс, а не в Base
, который все еще отсутствует.
Поэтому измените свой унаследованный класс, чтобы использоватьPacket
virtual void encode(Packet* packet) = 0;
Вы также можете изменить свой унаследованный класс и добавить что-то вроде:
void encode(Packet* packet) final {
encode(dynamic_cast<T*> packet);
}
Не забывайте и о виртуальных деструкторах ...