在c ++中进行子类化时为什么有时需要添加虚拟关键字来覆盖函数?

use*_*898 24 c++ inheritance virtual-functions

为什么我在谈论子类化/继承时有时会在C++示例中看到,基类有虚拟关键字,有时被覆盖的函数也有虚拟关键字,为什么有时需要向子类添加虚拟关键字?例如:

class Base 
{
  Base(){};
  virtual void f()
     ......
  }
};

class Sub : public Base
{
  Sub(){};
  virtual void f()
     ...new impl of f() ...
  }
};
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 32

没有必要,但如果您只看到派生类定义,它有助于提高可读性.

§10.3[class.virtual]/3

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

脚注97)基本上表明如果参数列表不同,则函数不会覆盖也不一定virtual