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

Der*_*ren 16 c++ polymorphism

当我覆盖虚函数时:

class Geoff
{
 public:
  virtual int getArea() { return 0; }
}
Run Code Online (Sandbox Code Playgroud)

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

class George : public Geoff
{
 public:
  virtual int getArea() { return x*y; }
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 26

如果你使用的是C++ 11,你应该使用override,这两个文件都覆盖了一个虚函数,并检查一个匹配的虚函数是否存在于一个基础中以便覆盖.

int getArea() override { return x*y; }
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,它是一种风格选择 - virtual如果您觉得它增加了文档价值,请加入.

  • 您还可以使用`final`来防止进一步的覆盖,这使编译器可以更容易地对该成员函数的调用进行简化. (2认同)

Ste*_*dit 7

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

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

编辑

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