如何覆盖非虚函数?

时间:2011-04-03 14:03:55

标签: c++ c++11 override virtual

override的新语法允许编译器报告错误,如果没有覆盖虚拟函数N3206

class Base {
    virtual void vfunc();
    void afunc();
};

以下案例将是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 // ?;

1 个答案:

答案 0 :(得分: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。