覆盖C++函数时是否应该再次指定'virtual'?

Should I specify 'virtual' again when I override a C++ function?

本文关键字:virtual 函数 C++ 是否 覆盖      更新时间:2023-10-16

当我重写虚函数时:

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

当我重写它时,我应该再次指定'virtual'吗?这有什么区别吗?我知道这两种方法似乎都很好,只是想知道是否还有更多的原因。

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

如果你使用c++ 11,你应该使用override来代替,它既记录你正在重写一个虚函数,又检查一个匹配的虚函数是否存在于一个要重写的基中。

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

在c++ 03中,这是一个风格上的选择-如果你觉得它增加了文档的价值,就把virtual放在里面。

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

它的优点是,如果方法在父类中不是虚拟的,则会失败。

编辑

正如Mark指出的,如果签名不匹配,它也会失败,而virtual会默默地"成功"。使用引号是因为不匹配的签名会隐藏基类中的遮蔽方法,并生成一个不相关的新虚拟方法。