如何覆盖非虚函数

How to override non-virtual functions?

本文关键字:函数 覆盖 何覆盖      更新时间:2023-10-16

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

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

以下情况将是 class Derived : public Base 中的错误,如 Std 示例中所述:

  • 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 // ?;

规范草案 (n3242) 说

如果虚拟函数用 virt 说明符重写进行标记,并且不覆盖基类的成员函数,则程序格式不正确。

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

一个 virt-specifier-seq 最多只能包含一个 virt-specim。virt-specifiers 覆盖和 final 只能出现在虚拟成员函数的声明中。

请注意,与基函数具有相同名称和参数列表(包括恒常性)但不是虚拟函数的函数不会覆盖该基函数。相反,据说它隐藏了基本函数。

指定函数通过在函数

的声明之后放置new而不是override来隐藏基函数是 C++0x 草稿的一部分,但不会是 C++0x 的一部分,因为在为非函数成员查找语法点以及时放置new时存在问题。因此,它被投票否决了C++0x。