提问者:小点点

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


我想知道我能在C++中重写非虚函数吗?因为我在玩C++重写关键字时发现了这个问题

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”:带有重写说明符“override”的方法没有重写任何基类方法,为什么会发生这种情况,因为B中的函数完全重写A中的函数,但是当我在A类中使用virtual关键字时,错误消失,代码完全运行


共3个答案

匿名用户

不覆盖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();
}

编译和执行:

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

将say virtual放入A(因此隐含在B中)((A&)B).say();从B打印,因为在B中时间被覆盖

匿名用户

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

在这里也可以看到答案

匿名用户

覆盖并不意味着您标记的函数会神奇地覆盖基函数。 它的目的是告诉编译器“请检查我是否真的重写了一个基类虚函数,如果我搞砸了,请给我一个不错的编译器错误,而不是做一些我不想做的事情”。

如果基类函数是virtual,您不需要说overrid,但是您可以这样做以帮助自己少犯错误。

如果基类函数不是virtual,则不能重写它,请使用overrid关键字或不重写。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(能在|c++|中|重写|非虚|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?