派生类中的虚拟限定符

amn*_*eet 5 c++

虚拟限定符到基类的虚函数,在派生类中有什么区别?

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

class d : public b
{
  public:
  void foo(){ .... }
};
Run Code Online (Sandbox Code Playgroud)

要么

class d : public b
{
  public:
  virtual void foo(){ .... }
}; 
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*Mat 6

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

从C++ 03标准,§10.3.2:

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


Stu*_*tLC 2

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

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