我是否还需要在子类方法上指定虚拟?

时间:2010-07-02 15:24:37

标签: c++ inheritance virtual-destructor

之前可能已经问过这个问题,但是我无法找到类似的问题。

考虑以下类层次结构:

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会产生什么后果?

感谢。

3 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:8)

You do not need it,但将其标记可能会使您的代码更清晰。

  

注意:如果您的基类有虚拟   析构函数,然后你的析构函数是   自动虚拟。你可能需要   另一个明确的析构函数   原因,但没有必要   重新声明析构函数只是为了制作   确定它是虚拟的。不管是否   你用虚拟声明它   关键字,声明它没有   虚拟关键字,或者不声明它   总的来说,它仍然是虚拟的。

答案 2 :(得分:6)

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

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