Уничтожение производного класса путем удаления базового класса - PullRequest
1 голос
/ 31 июля 2010

У меня есть ситуация, похожая на следующий код:

#include <iostream>

class A
{
public:
    A() { std::cout << "A created!" << std::endl; }
    ~A() { std::cout << "A destroyed!" << std::endl; }

    virtual const char* Name() { return "A"; }
};

class B : public A
{
public:
    B() { std::cout << "B created!" << std::endl; }
    ~B() { std::cout << "B destroyed!" << std::endl; }

    const char* Name() { return "B"; }
};

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

    std::cout << a->Name() << "\n";

    delete a;

    return 0;
}

Я хочу, чтобы B уничтожался, когда уничтожается и A.Возможно ли это в его деструкторе или мне нужно реализовать виртуальный метод Destroy () или что-то в этом роде?

Ответы [ 3 ]

3 голосов
/ 31 июля 2010

Как правило, если какой-либо из ваших методов является виртуальным, деструктор также должен быть виртуальным. Если это не так, объявленный тип переменной решает, какой деструктор будет вызван, а это почти никогда не то, что вам нужно. В 99,9% случаев вам нужен деструктор из типа времени выполнения.

1 голос
/ 31 июля 2010

Возможно ли это в деструкторе или мне нужно реализовать виртуальный метод Destroy () или что-то в этом роде?

Сделать деструктор виртуальным.

 virtual ~A() { std::cout << "A destroyed!" << std::endl; }

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

0 голосов
/ 31 июля 2010

Если вы применяете оператор «delete» к указателю базового класса, деструктор ДОЛЖЕН быть виртуальным (существование других виртуальных методов не имеет значения).Например, в случае множественного наследования оператор «delete», примененный к указателю базового класса, вызовет ошибку памяти, поскольку компилятор даже не знает, где начинается память, занятая производным объектом.

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