При наследовании от виртуального класса, компилятор выдает ошибку

232
28 июля 2022, 10:00

Пытаюсь наследоваться от виртуального класса, компилятор выдает следующую ошибку:

/home/anton/dev/techno_park/geo_index_service/test8/main.cpp:96: неопределённая ссылка на «ICashTable<int, int>::~ICashTable()»

Как это исправить?

#include <map>
template <class Key, class Val>
class ICashTable{
public:
    virtual ~ICashTable() = 0;
};
template <class Key, class Val>
class CashTableMap : ICashTable<Key, Val>{
private:
    std::map<Key, Val> map;
public:
    CashTableMap() = default;
    ~CashTableMap() = default;
};
Answer 1

Что происход при удалении обьекта класса CashTableMap?

  1. Вызывается деструктор класса CashTableMap
  2. Вызывается деструктор базового класса ICashTable

В базовом классе деструктор обьявлен как чисто вирутальная функция. Но тела у неё нет. Вот и получается ссылка на функцию без реализации. Запомните: если деструктор чисто виртуальный, то у него всё равно должно быть тело, которое программа сможет выполнить.
Кстати, это относится к любым чисто виртуальным функциям. Если функция чисто виртуальная, то это не значит что у неё не может быть тела. Может. И Вы можете вызывать её в функциях производного класса.

READ ALSO
Не работает merge stl

Не работает merge stl

У меня есть класс Patient и два вектора, которые содержат экземпляры этого класса, patients и newPatientsЯ хочу объединить их в один вектор fullListOfPatients с помощью...

247
Создание стольких блоков сколько записей в БД

Создание стольких блоков сколько записей в БД

Всем приветЯ для тренировки решил сделать справочный сайт со статьями

202
Помогите отсортировать массив php

Помогите отсортировать массив php

Помогите пожалуйста с сортировкойЕсть примерно такой массив:

311