класс имеет виртуальные функции и доступный не виртуальный деструктор - PullRequest
14 голосов
/ 29 апреля 2011

У меня есть два класса:

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

Понятия не имею, что это за ошибка ... Где-то в блогах я читал, что это предупреждение компилятора. Как я могу решить проблему?

Ответы [ 4 ]

19 голосов
/ 29 апреля 2011

Это происходит потому, что в вашем базовом классе A нет виртуального деструктора. Например, если у вас был этот код:

int main()
{
    A* a = new B;
    delete a;
}

Тогда вызов delete a не сможет вызвать деструктор B, поскольку A не является виртуальным. (Это приведет к утечке всех ресурсов B.) Вы можете узнать больше о виртуальных деструкторах здесь .

Добавьте виртуальный деструктор в базовый класс, и все будет в порядке.

class A
{
public:  
    virtual void somefunction() = 0;
    virtual ~A() = 0;
}
6 голосов
/ 29 апреля 2011

Дайте класс A:

virtual ~A() { }

Таким образом, производные классы, такие как B, будут по-прежнему вызывать свой собственный деструктор, если вы delete вызовете их через A*.

3 голосов
/ 29 апреля 2011

Если у класса есть виртуальные функции, то его деструктор также должен быть виртуальным. У вас есть доступный деструктор, но он не виртуальный.

2 голосов
/ 10 мая 2012

Как правило для большого пальца (IMHO) или вкратце, деструктор в базовом классе должен быть либо общедоступным, либо виртуальным, либо защищенным, не виртуальным, чтобы предотвратить утечку памяти. При этом деструкторы * Вызывается 1004 * производного класса, и это предотвращает утечку памяти всякий раз, когда базовый указатель / ссылка , содержащий производный адрес / ссылку , удаляется.

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