我可以覆盖 C++ 中的非虚函数吗
Can i override non virtual function in 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' 的方法没有覆盖任何基础 class 方法
但是当我在 class 中使用 virtual 关键字时,错误消失了,代码运行完美
不,你不能。
“在成员函数声明或定义中,override 确保该函数是虚拟的,并且正在覆盖来自基础 class 的虚拟函数。如果不是这样,则程序格式错误(生成编译时错误)是的。"
另见答案
您没有在 B
中覆盖 say
In a member function declaration or definition, override ensures that the function is virtual and is overriding a virtual function from a base class. The program is ill-formed (a compile-time error is generated) if this is not true.
看看那个例子:
#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();
打印 From B
因为那个时候有覆盖
override
并不意味着你标记的函数会神奇地覆盖基函数。它的目的是告诉编译器“请检查我实际上在这里重写了一个基本 class 虚函数,如果我搞砸了,请给我一个很好的编译器错误,而不是做我不打算做的事情”。
如果基础 class 函数是 virtual
你 不需要 说 override
,但你可以这样做来帮助自己少犯错误。
如果基础 class 函数是 不是 virtual
你不能覆盖它,override
关键字与否。
我想知道我可以在 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' 的方法没有覆盖任何基础 class 方法
但是当我在 class 中使用 virtual 关键字时,错误消失了,代码运行完美
不,你不能。 “在成员函数声明或定义中,override 确保该函数是虚拟的,并且正在覆盖来自基础 class 的虚拟函数。如果不是这样,则程序格式错误(生成编译时错误)是的。"
另见答案
您没有在 B
中覆盖 sayIn a member function declaration or definition, override ensures that the function is virtual and is overriding a virtual function from a base class. The program is ill-formed (a compile-time error is generated) if this is not true.
看看那个例子:
#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();
打印 From B
因为那个时候有覆盖
override
并不意味着你标记的函数会神奇地覆盖基函数。它的目的是告诉编译器“请检查我实际上在这里重写了一个基本 class 虚函数,如果我搞砸了,请给我一个很好的编译器错误,而不是做我不打算做的事情”。
如果基础 class 函数是 virtual
你 不需要 说 override
,但你可以这样做来帮助自己少犯错误。
如果基础 class 函数是 不是 virtual
你不能覆盖它,override
关键字与否。