派生类中的虚拟限定符

时间:2011-08-17 19:03:15

标签: c++

派生类中基类的虚函数的虚拟限定符是否会产生任何差异?

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

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

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

这两个声明是否有任何区别,除了它让d的孩子知道foo()的虚拟性?

4 个答案:

答案 0 :(得分:6)

没有区别。 foo在所有来自b(及其后代)的类中都是虚拟的。

从C ++ 03标准,§10.3.2:

  

如果虚拟成员函数vf在类Base和Derived中直接或间接派生的类中声明,则声明具有与Base :: vf相同名称和相同参数列表的成员函数vf,然后派生:: vf也是虚拟的(是否如此声明)并且它会覆盖Base :: vf。

答案 1 :(得分:2)

没有区别 - 无论如何都是虚拟覆盖。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

没有区别。

一旦foo 虚拟,其虚拟将永远存在于类层次结构中,无论您从类层次结构的基础走多远。

但我更喜欢在覆盖函数中编写virtual,因为它为代码添加了可读性,这非常重要。