之前可能已经问过这个问题,但是我无法找到类似的问题。
考虑以下类层次结构:
class BritneySpears
{
public:
virtual ~BritneySpears();
};
class Daughter1 : public BritneySpears
{
public:
virtual ~Daughter1(); // Virtual specifier
};
class Daughter2 : public BritneySpears
{
public:
~Daughter2(); // No virtual specifier
};
Daughter1
和Daughter2
类之间是否存在差异?
在子类析构函数/方法上指定/不指定virtual
会产生什么后果?
感谢。
答案 0 :(得分:32)
从技术上讲,您不需要指定virtual
。如果基本方法是虚拟的,那么C ++将自动生成匹配覆盖方法virtual
。
但是你应该标记它们virtual
。毕竟该方法是virtual
,它使您的代码更清晰,更容易被其他开发人员遵循。
答案 1 :(得分:8)
You do not need it,但将其标记可能会使您的代码更清晰。
注意:如果您的基类有虚拟 析构函数,然后你的析构函数是 自动虚拟。你可能需要 另一个明确的析构函数 原因,但没有必要 重新声明析构函数只是为了制作 确定它是虚拟的。不管是否 你用虚拟声明它 关键字,声明它没有 虚拟关键字,或者不声明它 总的来说,它仍然是虚拟的。
答案 2 :(得分:6)
无论您是否在子类中指定虚拟,都会自动在派生方法覆盖上选择虚拟。
主要结果是,如果没有在子节点中指定virtual,则很难从子类定义中看到该方法实际上是虚拟的。出于这个原因,我总是在父类和子类中指定虚拟。