Класс имеет виртуальные функции и доступный не виртуальный деструктор
У меня есть два класса:
class A {
public:
virtual void somefunction() = 0;
};
class B : public A {
public:
B();
~B();
void somefunction();
};
B::B() {}
void B::somefunction() {
// some code
}
Но с g++ я получаю ошибки:
class A has virtual functions and accessible non-virtual destructor
class B has virtual functions and accessible non-virtual destructor
Я не знаю, что это за ошибка... Где-то в блогах я читал, что это предупреждение компилятора. Как я могу исправить проблему?
Ответы
Ответ 1
Это происходит потому, что ваш базовый класс A
не имеет виртуального деструктора. Например, если у вас есть этот код:
int main()
{
A* a = new B;
delete a;
}
Тогда вызов delete a
не сможет вызвать B
деструктор, потому что A
не является виртуальным. (Это приведет к утечке всех ресурсов B
.) Подробнее о виртуальных деструкторах здесь.
Добавьте виртуальный деструктор в ваш базовый класс, и все будет в порядке.
class A
{
public:
virtual void somefunction() = 0;
virtual ~A() = 0;
}
Ответ 2
Дайте класс A:
virtual ~A() { }
Таким образом, производные классы, такие как B, по-прежнему будут иметь свой настраиваемый деструктор, если вы delete
их через A*
.
Ответ 3
Если класс имеет виртуальные функции, то его деструктор также должен быть виртуальным. У вашего есть доступный деструктор, но он не является виртуальным.
Ответ 4
В качестве правила большого пальца (IMHO) или в Short деструктор в базовом классе должен быть либо публичный, либо виртуальный или защищенный не виртуальный, чтобы предотвратить утечку памяти. Таким образом, деструкторы вызываемого производного класса, и это предотвращает утечку памяти, когда удаляется базовый указатель/ссылка, содержащий выделенный адрес/ссылку.