在 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/