当前位置: 首页 > 知识库问答 >
问题:

如果基类析构函数是虚的,那么派生类的析构函数默认是虚的吗?

沈嘉瑞
2023-03-14

我最近在读虚函数和虚析构函数,下面的问题引起了我的兴趣。

例如,我有以下继承链。

class Base
{
public:
    virtual ~Base() // note: virtual
    {
        std::cout << "Calling ~Base()\n";
    }
};
 
class Derived: public Base
{
 
public:
 
    ~Derived() 
    {
        std::cout << "Calling ~Derived()\n";
    }
};

我知道基类的虚函数在派生类中默认是隐式虚的。所以,我认为这同样适用于析构函数。

我想知道,派生类的析构函数是否默认是虚拟的。如果没有,如果您提供一些解释,我将很高兴。

共有1个答案

戚峻
2023-03-14

我以为这同样适用于破坏者

对,没错。

我想知道,派生类的析构函数是否默认为虚拟的

在这个例子中,是的。

一旦某个东西被标记为< code>virtual,该东西的所有重写后代也是< code>virtual,不管它们是否明确声明了这一点。

因此,如果一个方法是虚拟,所有覆盖它的派生方法也是虚拟。如果析构函数是虚拟,则所有派生析构函数也是虚拟

 类似资料:
  • 为什么一个虚函数在派生类中默认是虚的,甚至不可能在派生类中完全移除虚性,这有什么好的理由吗? 我希望这种行为的原因与我不希望默认情况下每个函数都是的原因相同。编译器可能会生成牺牲性能的vtables。 基类应该有一个vtable(我想要多态性在那里),但派生类没有vtable(我不希望多态性在那里,为什么我要那样,只是因为它派生了一个具有多态性的类?)。 我想解决的问题是更好地理解虚函数。我只是没

  • 在C 11中,我们能够声明一个析构函数是自动生成的: 此外,我们可以将析构函数声明为纯虚: 我的问题是:如何将析构函数声明为自动生成和纯虚拟?看起来以下语法不正确: 这一个也不是: 也不是这个: 编辑:关于问题目的的一些澄清。基本上,我希望一个空类是不可实例化的基类,但派生类是可实例化的,那么该类必须有一个纯虚拟析构函数。但另一方面,我不想在.cpp文件中提供定义。因此,我需要某种与等效的机制。我

  • 每个人都知道基类的分解器通常必须是虚拟的。但是派生类的析构函数是什么?在 C 11 中,我们有关键字“override”,并且能够显式使用默认析构函数。 在子类的析构函数中同时使用关键字“覆盖”和“=默认”是否正确?在这种情况下,编译器会生成正确的虚拟析构函数吗? 如果是,那么我们是否可以认为这是好的编码风格,我们应该总是这样声明派生类的析构函数,以确保基类析构函数是虚的?

  • 当派生类不是立即派生,而是从已经派生的类派生时,我对覆盖函数感到困惑。 在这两种情况下,都调用了最派生的析构函数。我想知道是否只需要大多数基类有一个声明为虚拟的析构函数,在这种情况下,从它继承的所有其他类都有虚拟析构函数,覆盖上游的所有其他析构函数,如果你明白我的意思的话。 我不确定我是否有意义,基本上,如果我有一系列10个类,每个类都从上一个继承,那么链中的任何析构函数都会覆盖所有比它更基础的析

  • 本文向大家介绍请你回答一下为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数?相关面试题,主要包含被问及请你回答一下为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数?时的应答技巧和注意事项,需要的朋友参考一下 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。  

  • 和构造函数类似,析构函数也不能被继承。与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉。 另外析构函数的执行顺序和构造函数的执行顺序也刚好相反: 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构