虚拟析构函数是继承的吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

如果我有一个虚拟析构函数的基类。有派生类来声明虚拟析构函数吗?

class base {
public:
    virtual ~base () {}
};

class derived : base {
public:
    virtual ~derived () {} // 1)
    ~derived () {}  // 2)
};

具体问题:

声明派生析构函数的最佳做法是什么?如果可能,声明是虚拟的还是非虚拟的?

提问于
用户回答回答于

派生类不声明虚拟事物并不能阻止它虚拟化。实际上,如果在基类中是虚拟的,则无法阻止任何方法(包括析构函数)在派生类中虚拟化。在> = C ++ 11中,可以使用final它来防止它在派生类中被重写,但这并不妨碍它成为虚拟的。

如果派生类中的析构函数无关,可以省略它。它的虚拟与否并不重要。

virtual为了清晰起见,我总是在派生类中再次使用关键字来实现虚函数。人们不应该一直沿着继承层次去找出函数是虚拟的。此外,如果你的类是可复制或可移动的,而无需声明你自己的副本或移动构造函数,则声明任何类型的析构函数(即使将其定义为default)也会强制你声明副本并移动构造函数和赋值运算符因为编译器将不再为你提供它们。

用户回答回答于

虚拟成员函数将隐式地重载这个虚函数。

基类析构函数是虚拟的,所有的子析构函数也是虚拟的。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券