在整个网络上,以及在Bjarne Stroustrup的C ++书中,我都看到类似这样的语句:“如果将基本析构函数声明为虚拟的,那么它将被派生类的析构函数覆盖。”
但是,为什么将其称为优先?它与覆盖功能的“通常”方式略有不同吗?通常,我的意思是派生类中的典型虚函数,与基类共享相同的方法签名。在那种通常的情况下,根据指针所指向的实际对象,基本版本或派生版本都将被忽略。...让我们不详细介绍通常意义上的重写如何工作。
但是在析构函数的情况下,无论如何,都会最终调用基本析构函数 。另外,它的名称也不同。为什么将其称为覆盖?
答案 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().