我可以在 C++ 中重写非虚函数吗

Dan*_*yal 3 c++ overriding

我想知道我可以重写 C++ 中的非虚函数吗,因为我在使用 C++ override关键字时发现了这个问题,我的代码如下

class A
{
public:
    void say()
    {
        cout << "From A\n";
    }
};
class B : public A {
public:
    void say()
        override
    {
        cout << "From B\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

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

bru*_*uno 7

你不重写B中的say

来自 C++ 覆盖说明符

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

看那个例子:

#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();
}
Run Code Online (Sandbox Code Playgroud)

编译与执行:

pi@raspberrypi:/tmp $ g++ c.cc
pi@raspberrypi:/tmp $ ./a.out
From A
From B
From A
pi@raspberrypi:/tmp $ 
Run Code Online (Sandbox Code Playgroud)

虚拟放在 A 中(因此隐式地放在 B 中)((A &) b).say();打印From B,因为那时有压倒性的