当我覆盖C ++函数时,我应该再次指定'virtual'吗?

时间:2014-06-13 04:21:51

标签: c++ polymorphism

当我覆盖虚拟功能时:

class Geoff
{
 public:
  virtual int getArea() { return 0; }
}

当我覆盖它时,我应该再次指定'virtual'吗?它有什么不同吗?我知道两种方式似乎都很好,只是想知道它是否还有更多。

class George : public Geoff
{
 public:
  virtual int getArea() { return x*y; }
}

2 个答案:

答案 0 :(得分:26)

如果你使用C ++ 11,你应该使用override,它们都会覆盖你正在覆盖虚函数并检查基础中是否存在匹配的虚函数以进行覆盖。

int getArea() override { return x*y; }

在C ++ 03中,它是一种风格选择 - 如果你觉得它增加了文档值,就把virtual放进去。

答案 1 :(得分:7)

不,使用覆盖。 (http://en.cppreference.com/w/cpp/language/override

如果方法在父级中不是虚拟的,则它具有失败的优势。

修改

正如马克指出的那样,如果签名不匹配,它也会失败,而虚拟会默默地“成功”。恐慌引用是因为不匹配的签名会隐藏基础中的阴影方法并创建一个不相关的新虚拟方法。