派生类中基类的虚函数的虚拟限定符是否会产生任何差异?
class b
{
public:
virtual void foo(){}
};
class d : public b
{
public:
void foo(){ .... }
};
或
class d : public b
{
public:
virtual void foo(){ .... }
};
这两个声明是否有任何区别,除了它让d的孩子知道foo()的虚拟性?
答案 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
,因为它为代码添加了可读性,这非常重要。