Может ли базовый деструктор действительно быть переопределен производным деструктором в C ++? - PullRequest
0 голосов
/ 28 января 2019

Во всем Интернете, а также в книге Бьярна Страуструпа по С ++ я вижу такие выражения: «Если базовый деструктор объявлен виртуальным, то он переопределяется деструктором производного класса.»

Но почемуэто называется переопределением?Разве это не немного отличается от «обычного» способа переопределения функций?Обычно я имею в виду типичную виртуальную функцию в производном классе, имеющую ту же сигнатуру метода, что и в базе.В этом обычном случае либо базовая версия, либо производная версия игнорируется в зависимости от фактического объекта, на который указывает указатель .... Давайте не будем вдаваться в подробности того, как переопределение работает в обычном смысле.

Нов случае деструкторов базовый деструктор в конечном итоге будет вызван , несмотря ни на что.Кроме того, его имя отличается.Почему тогда это называется переопределением?

1 Ответ

0 голосов
/ 28 января 2019

Почему тогда это называется переопределением?

Поскольку оно переопределяет деструктор базового класса.

Учитывайте следующее:

struct Foo
{
   ~Foo() {}
};

struct Bar : Foo
{
   ~Bar() {} // This does not override ~Foo.
};

Foo* fptr = new Bar;
delete fptr;  // ~Foo() is called.

~Bar() будет вызываться, если указатель Bar*.

Bar* bptr = new Bar;
delete bptr;  // ~Bar() is called.

Однако, если вы измените Foo на:

struct Foo
{
   virtrual ~Foo() {}
};

struct Bar : Foo
{
   ~Bar() {} // This overrides ~Foo.
};

, тогда используйте

Foo* fptr = new Bar;
delete fptr;  // ~Bar() is called.
              // ~Bar() overrides ~Foo().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...