我想知道我能在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关键字时,错误消失,代码完全运行
不覆盖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
关键字或不重写。