28

这可能以前在 SO 上被问过,但我找不到类似的问题。

考虑以下类层次结构:

class BritneySpears
{
  public:

    virtual ~BritneySpears();
};

class Daughter1 : public BritneySpears
{
  public:

    virtual ~Daughter1(); // Virtual specifier
};

class Daughter2 : public BritneySpears
{
  public:

    ~Daughter2(); // No virtual specifier
};

Daughter1Daughter2类有区别吗?

virtual在子类析构函数/方法上指定/不指定的后果是什么?

4

3 回答 3

37

不,您在技术上不需要指定virtual. 如果基本方法是虚拟的,那么 C++ 将自动生成匹配的覆盖方法virtual

但是,您应该标记它们virtual。该方法virtual毕竟是,它使您的代码更清晰,更容易被其他开发人员遵循。

于 2010-07-02T15:28:52.323 回答
9

您不需要它,但标记它可能会使您的代码更清晰。

注意:如果你的基类有一个虚拟析构函数,那么你的析构函数自动是虚拟的。出于其他原因,您可能需要显式析构函数,但没有必要仅仅为了确保它是虚拟的而重新声明析构函数。不管是用virtual关键字声明,还是不用virtual关键字声明,或者根本不声明,它仍然是virtual。

于 2010-07-02T15:29:34.600 回答
7

无论您是否在子类中指定它,都会在派生方法覆盖时自动选择虚拟。

主要的后果是,如果没有在子类中指定 virtual,就很难从子类定义中看出该方法实际上是虚拟的。出于这个原因,我总是在父类和子类中指定 virtual 。

于 2010-07-02T15:29:11.897 回答