覆盖C++ 2011中的非虚函数

tow*_*owi 6 c++ virtual overriding c++11

override如果没有真正覆盖虚函数N3206,那么新的语法允许让编译器报告错误.

class Base {
    virtual void vfunc();
    void afunc();
};
Run Code Online (Sandbox Code Playgroud)

class Derived : public Base标准示例中所述,以下情况将是错误:

  • void vfunk() override; // err: typo
  • void vfunc(int) override; // err: argument
  • void vfunc() const override; // err: cv

但是如果基本方法不是虚拟的呢?

  • void afunk() override; // ?
  • void afunc(int) override; // ?
  • void afunc() const override // ?;

Joh*_*itb 11

规范草案(n3242)说

如果使用virt-speci fi er覆盖标记虚函数并且不覆盖基类的成员函数,则该程序格式错误.

由于您显示的函数声明不是虚拟的,因此您也会遇到异常

virt-specifier-seq最多应包含每个virt-specifier中的一个.virt-specifiers override和final只出现在虚拟成员函数的声明中.

请注意,具有相同名称和参数列表(包括constness)作为基本函数但不是虚拟的函数不会覆盖该基函数.相反,它被称为隐藏基本功能.

指定一个函数隐藏一个基函数,new而不是override在函数声明之后是C++ 0x草案的一部分,但不会成为C++ 0x的一部分,因为找到非函数成员的语法点有问题new及时投入.因此,它被投票支持C++ 0x.