基本析构函数真的可以被C ++中的派生析构函数覆盖吗?

时间:2019-01-28 05:27:50

标签: c++11 override virtual-destructor

在整个网络上,以及在Bjarne Stroustrup的C ++书中,我都看到类似这样的语句:“如果将基本析构函数声明为虚拟的,那么它将被派生类的析构函数覆盖。”

但是,为什么将其称为优先?它与覆盖功能的“通常”方式略有不同吗?通常,我的意思是派生类中的典型虚函数,与基类共享相同的方法签名。在那种通常的情况下,根据指针所指向的实际对象,基本版本或派生版本都将被忽略。...让我们不详细介绍通常意义上的重写如何工作。

但是在析构函数的情况下,无论如何,都会最终调用基本析构函数 。另外,它的名称也不同。为什么将其称为覆盖?

1 个答案:

答案 0 :(得分:2)

  

为什么将其称为覆盖?

因为它会覆盖基类的析构函数。

考虑一下:

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().