виртуальный деструктор? - PullRequest
0 голосов
/ 27 января 2012

получаю пару ошибок, что это виртуальная функция с не виртуальным деструктором. как я могу исправить эту ошибку? это работало в g ++ 4.6.x, но мне нужно, чтобы оно работало на более старой версии g ++. (

#include <list>

template <typename T>
class container{
public:
    ~queue(){
        queuel.clear();
        queuel.~list();
    }
    virtual T func_x(){
        T temp;
        //do stuff with list<t> test
        return temp;
    }
private:
    std::list<T> test;
};

template <typename T>
class container2 : public container<T>{
public:
    virtual T func_x(){
        T temp;
        //do different stuff with list<T> test
        return temp;
    }
};

1 Ответ

4 голосов
/ 27 января 2012

Редактировать: @Als имеет точку, деструктор также неправильно назван для вашего класса. Обновленный ответ.

Проблема в том, что g ++ считает, что, поскольку у вас есть виртуальные методы в классе, у вас должен быть виртуальный деструктор. Это связано с тем, что если вы наследуете класс и расширяете его, вы можете выделить память или другие ресурсы, которые деструктор базового класса не имеет понятия об очистке, и если ваш деструктор не является виртуальным, деструктор базового класса может быть вызван в некоторых случаях вместо вашего реального деструктора.

Практическое правило: если у вас есть виртуальные методы в вашем классе, используйте виртуальный деструктор. Удаление неправильно названного деструктора ~ очереди и помещение

virtual ~container();

в вашем объявлении класса и устранение деструктора в файле .cpp должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...