在派生类中使用“虚拟”

时间:2010-02-11 03:29:06

标签: c++ virtual

我最近在派生类中看到了代码,程序员将virtual置于重写的函数前面。这是常见的吗?我觉得这很奇怪,有点让我措手不及。

编辑:我不是在问虚拟是什么,我问为什么有人会将虚拟放入已经覆盖其基类中的虚函数的派生类中。

EX:

class B {
 public:
  virtual void foo();
  ....
};

class D : public B {
 public:
  virtual void foo(); // could have just put void foo();
  ...
};

7 个答案:

答案 0 :(得分:25)

最高(最少派生)级别的可重写函数需要

virtual。它是可选的,但在较低(更多派生)的水平上是无害的。它可以自我记录代码。

答案 1 :(得分:8)

这很常见。许多风格指南推荐它,例如Google。 目的是增强代码的可读性。

答案 2 :(得分:5)

这些答案(和这种做法)已经过时了。从C ++ 11开始,您应该使用override keyword明确指定虚函数覆盖另一个虚函数。如果您尝试override基类中不是虚函数的东西,编译器将抛出错误!

答案 3 :(得分:4)

我没有看到任何奇怪的东西。在许多情况下(如果不是大多数情况下)程序员通过从基类复制粘贴来在派生类中创建重写函数的声明。花费额外的精力来手动删除冗余的virtual说明符是没有意义的。此外,显式virtual可以更容易地查看哪些功能是虚拟的。

答案 4 :(得分:3)

我假设您知道虚拟关键字的用途,但想知道它突然出现在子类型中的原因。如果我弄错了,我的回答可能没有多大意义,但任何C ++引用都会有所帮助。

将虚拟放入派生类是完全合法的。因此,如果您有一个指向该类或其任何子类的引用或指针,则将根据运行时类型动态绑定此函数的调用。

虽然合法,但在基类中使用非虚拟方法而在重写版本中使用虚拟方法并不是一种好的设计。

一个原因是你可以拥有一个派生类的实例,然后是一个指向base的指针和一个指向派生的指针,并且两个指针都针对这个实例。因此,在每个指针上调用相同的函数会产生不同的结果,因为对基类声明的指针的调用将定位基类中的定义。

答案 5 :(得分:3)

增强可读性的另一种方法是使用以下内容:

class B {
 public:
  virtual void foo();
  ....
};

class D : public B {
 public:
  /*override*/ void foo();
  ...
};

答案 6 :(得分:1)

如果未来的推导也会有所帮助。如果有人想要派生D类并拥有虚函数,那么它很容易理解