派生类中的虚拟限定符

virtual qualifier in derived class

本文关键字:虚拟 派生      更新时间:2023-10-16

派生类中基类虚函数的虚限定符有区别吗?

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

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

这两个声明有什么不同,除了它使d的子元素知道foo()的虚拟性吗?

这没什么区别。foo在所有从b(及其后代)派生的类中都是虚的。

来自c++ 03标准,§10.3.2:

如果在Base类中声明虚成员函数vf,在直接或间接从Base派生的派生类中声明与Base::vf具有相同名称和相同形参列表的成员函数vf,则Derived::vf也是虚的(无论是否这样声明)并覆盖Base::vf。

没有区别-无论哪种方式都是虚拟覆盖。

这是一个风格问题,这里已经明确讨论过了

包含virtual关键字是更好的样式。但这不是必需的

无差异

一旦foo虚的,它的虚的在类层次结构中永远是虚的,不管你离类层次结构中的基有多远。

但是我更喜欢在重写函数中编写virtual,因为它为代码增加了可读性,这很重要。