【问题标题】:Can i override non virtual function in c++我可以在 C++ 中覆盖非虚函数吗
【发布时间】:2020-06-28 11:42:32
【问题描述】:

我想知道我可以在 c++ 中覆盖非虚函数吗,因为我在玩 c++ 时发现了这个问题 override关键字我的代码如下

class A
{
public:
    void say()
    {
        cout << "From A\n";
    }
};
class B : public A {
public:
    void say()
        override
    {
        cout << "From B\n";
    }
};

但是当我执行代码时,Visual Studio 显示以下错误
'B::say': 带有覆盖说明符“覆盖”的方法没有覆盖任何基类方法 但是当我在 A 类中使用 virtual 关键字时,错误消失了,代码运行完美

【问题讨论】:

  • 你做不到是你做不到的一个非常强烈的指标,不是吗?您可能想从the book list 中挑选一些东西。
  • 您偶然发现了 virtualnon-virtual 类成员之间差异的最实际含义之一。您是否更熟悉 Java?在后者中,所有方法默认都是虚拟的。
  • 这能回答你的问题吗? Why Should not Override Non-Virtual Functions

标签: c++ overriding


【解决方案1】:

你没有覆盖 B

中的 say

from C++ override specifier

在成员函数声明或定义中,override 确保函数是虚拟的,并且覆盖基类中的虚拟函数。如果这不是真的,则程序格式错误(生成编译时错误)。

看看那个例子:

#include <iostream>

class A
{
  public:
    void say()
    {
        std::cout << "From A\n";
    }
};

class B : public A {
  public:
    void say()
        //override
    {
        std::cout << "From B\n";
    }
};

int main()
{
  A a;
  B b;
  
  a.say();
  b.say();
  ((A &) b).say();
}

编译和执行:

pi@raspberrypi:/tmp $ g++ c.cc
pi@raspberrypi:/tmp $ ./a.out
From A
From B
From A
pi@raspberrypi:/tmp $ 

say 放在 A 中(隐含在 B 中)((A &amp;) b).say(); 会打印出 From B,因为那时存在覆盖

【讨论】:

    【解决方案2】:

    不,你不能。 “在成员函数声明或定义中,override 确保该函数是虚拟的,并且正在覆盖来自基类的虚拟函数。如果这不是真的,则程序是格式错误的(生成编译时错误)。”

    另见答案 here

    【讨论】:

    • 感谢您的回答,我只是在 programizjavatpoint 等各种网站上观看答案感到困惑。我不明白他们怎么能说他们提供的例子是覆盖所以我只是放了 override 关键字,因为我知道它会说那​​不是覆盖,因为它是为了检测天气函数是否被覆盖而开发的
    【解决方案3】:

    override 并不意味着你标记的函数会神奇地覆盖基函数。它的目的是告诉编译器“请检查我是否真的在这里覆盖了基类虚函数,如果我搞砸了,请给我一个很好的编译器错误,而不是做我不打算做的事情”。

    如果基类函数是virtual,你不需要override,但是你可以这样做来帮助自己减少错误。

    如果基类函数不是virtual你不能覆盖它,override关键字或者不是。

    【讨论】:

    • 感谢您的回答,我只是在 programizjavatpoint 等各种网站上观看答案感到困惑。我不明白他们怎么能说他们提供的例子是覆盖所以我只是放了 override 关键字,因为我知道它会说那​​不是覆盖,因为它是为了检测天气函数是否被覆盖而开发的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2011-12-19
    • 2013-08-11
    • 2015-06-17
    相关资源
    最近更新 更多