По умолчанию виртуальный д'тор
Допустим, у меня есть два класса:
class Base{};
class Derived: public Base{};
никто не имеет d'or, в этом случае, если я объявлю о переменных:
Base b;
Derived d;
мой компилятор выдаст мне d'ors, мой вопрос, d'ors по умолчанию b and d
будет виртуальным или нет?
6 ответов
мой вопрос, d'ors of b и d будут виртуальными или нет
Нет, они не будут. Если вам нужен виртуальный деструктор, вам придется определить свой собственный, даже если его реализация точно такая же, как та, которая будет предоставлена компилятором:
class Base {
public:
virtual ~Base() {}
};
Деструкторы Base
а также Derived
не будет virtual
, Сделать virtual
деструктор, нужно пометить его явно:
struct Base
{
virtual ~Base() {}
};
На самом деле есть только одна причина использовать виртуальные деструкторы. Это значит отключить предупреждение gcc: "класс" Base "имеет виртуальные функции, но не виртуальный деструктор". Пока вы всегда храните свои выделенные объекты в shared_ptr
тогда вам действительно не нужен виртуальный деструктор. Вот как:
#include <iostream> // cout, endl
#include <memory> // shared_ptr
#include <string> // string
struct Base
{
virtual std::string GetName() const = 0;
};
class Concrete : public Base
{
std::string GetName() const
{
return "Concrete";
}
};
int main()
{
std::shared_ptr<Base> b(new Concrete);
std::cout << b->GetName() << std::endl;
}
shared_ptr
будет убирать правильно, без необходимости виртуального деструктора. Помните, что вам нужно будет использовать shared_ptr
хоть!
Удачи!
мой вопрос, d'ors of b и d будут виртуальными или нет
Краткий ответ: Нет!
Они НЕ будут виртуальными. Однако, если вы объявите (и определили) виртуальный dtor в Base, тогда производный dtor будет автоматически виртуальным. НТН.
Как они могут быть виртуальными, если вы явно не сделаете их виртуальными
Просто чтобы добавить еще один пример к ответу Даниэля Лидстрёма
As long as you always store your allocated objects in a shared_ptr, then you really don't need a virtual destructor.
Если кто-то использует shared_ptr, как это:
std::shared_ptr<Base> b(new Concrete);
Затем Бетонный деструктор и Базовый деструктор вызываются на уничтожение объекта.
Если кто-то использует shared_ptr, как это:
Base* pBase = new Concrete;
std::shared_ptr<Base> b(pBase);
Тогда только Базовый деструктор вызывается на уничтожение объекта.
Это пример
#include <iostream> // cout, endl
#include <memory> // shared_ptr
#include <string> // string
struct Base
{
virtual std::string GetName() const = 0;
~Base() { std::cout << "~Base\n"; }
};
struct Concrete : public Base
{
std::string GetName() const
{
return "Concrete";
}
~Concrete() { std::cout << "~Concrete\n"; }
};
int main()
{
{
std::cout << "test 1\n";
std::shared_ptr<Base> b(new Concrete);
std::cout << b->GetName() << std::endl;
}
{
std::cout << "test 2\n";
Base* pBase = new Concrete;
std::shared_ptr<Base> b(pBase);
std::cout << b->GetName() << std::endl;
}
}