gpt4 book ai didi

c++ - 是否建议显式地使重写函数成为虚拟的?

转载 作者:可可西里 更新时间:2023-11-01 18:37:51 25 4
gpt4 key购买 nike

在 C++11 之前,当在派生类中重写虚函数时,建议将 virtual 关键字也添加到派生类函数中以明确意图。

现在这样的函数被标记为“override”,其中包含必须有一个虚拟基函数的概念。因此,我现在更愿意省略虚拟:

class Derived: public Base {
public:
void Overriden() override;
// Instead of: virtual void Overriden() override;
};

然而,这会导致 MSVC 2012 中出现 IntelliSense 错误:'override' 修饰符需要一个带有显式 'virtual' 关键字的虚函数声明

明明是编译器编译的类,但是报错让我想了想。是否仍有正当理由添加虚拟关键字?

最佳答案

documentation 中所报告对于 override 关键字,它的意思是手头的函数必须重写一个虚函数:

In a method declaration, override specifies that the function must be overriding a base class method.

这是强制执行(即让编译器强制执行)此类要求的一种方式。当然,如果基类的函数不是虚函数,代码将无法编译。因此,正如您所指出的,添加虚拟是多余的。

我认为在 c++11 之前添加它也不是什么好建议。考虑这段代码:

#include <iostream>

using namespace std;

class A{
public:
void f(){
cout << "A" << endl;
}
};

class B : public A{
public:
virtual void f(){
cout << "B" << endl;
};
};

class C : public B{
public:
void f(){
cout << "C" << endl;
};
};

int main( int argc, char* argv[] )
{
C c;
A& aref = c;
aref.f();
B& bref = c;
bref.f();
}

其输出显然是“A”后跟“C”。如您所见,在 class C 中添加 virtual 根本没有任何效果,而在 class B 中添加 virtual起着关键作用。按照将 virtual 添加到 class C 的惯例会使这一点一目了然。

关于c++ - 是否建议显式地使重写函数成为虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18765380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com