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 // ?;
答案 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。