2010-07-02 78 views
21

这可能以前曾被问过,但我无法找到类似的问题。我是否还需要在子类方法上指定虚拟?

考虑下面的类层次结构:

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有什么后果?

谢谢。

+2

请注意读者:也请看看C++ 11中的['override'](http://stackoverflow.com/questions/13880205/override-in-c11)关键字,它与那个话题。 – ereOn 2014-06-12 06:57:40

回答

28

不,你在技术上不需要指定virtual。如果基本方法是虚拟的,则C++将自动生成匹配重写方法virtual

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

+0

这里有很多很好的答案。我选择了最受欢迎的:)谢谢大家。 – ereOn 2010-07-02 16:01:25

6

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

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

8

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

注意:如果你的基类有虚析构函数 ,那么你的析构函数是 自动虚拟的。您可能需要 显式析构函数为其他 的原因,但没有必要 重新声明析构函数只是为了使 确定它是虚拟的。无论是 您声明虚拟 关键字,声明它没有 虚拟关键字,或根本不声明它 它仍然是虚拟的。

相关问题