如何重写非虚函数?

发布于 2024-10-29 04:37:45 字数 719 浏览 0 评论 0原文

override 的全新语法允许编译器在没有真正重写虚拟函数N3206

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

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

  • void vfunk() override; // 错误:拼写错误
  • void vfunc(int) override; // 错误:参数
  • void vfunc() const override; // err: cv

但是如果基本方法不是虚拟怎么办?

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

The very new syntax of override allows to let the compiler to report an error, if one does not really override a virtual function N3206.

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

The following cases will be an error in class Derived : public Base, as mentioned in the Std examples:

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

But what if the base method is not virtual?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

她如夕阳 2024-11-05 04:37:45

规范草案(n3242)说

如果虚拟函数被标记为 virt-speciifier override,并且没有覆盖基类的成员函数,则程序格式错误。

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

一个 virt-specifier-seq 最多应包含每个 virt-specifier 中的一个。 virt 说明符 override 和 Final 只能出现在虚拟成员函数的声明中。

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

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

The spec draft (n3242) says

If a virtual function is marked with the virt-specifier override and does not override a member function of a base class, the program is ill-formed.

Since the function declarations you show are not virtual, you also run afoul of

A virt-specifier-seq shall contain at most one of each virt-specifier. The virt-specifiers override and final shall only appear in the declaration of a virtual member function.

Note that a function that has the same name and parameter list (including constness) as a base function, but that is not virtual does not override that base function. It is instead said to hide the base function.

Designating that a function hides a base function by putting new instead of override after the function's declaration was part of the C++0x draft, but will not be part of C++0x as there were problems with finding syntax spots for non-function members for putting new at, in time. Consequently, it was voted out for C++0x.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文