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

标签 c++ c++11 overriding virtual

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

相关文章:

c++ - 我在哪里可以了解编译器和断言优化?

c++ - 指针 vector 调整大小

C++显式通用引用构造函数不隐藏拷贝构造函数?

c++ - 在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?

python - 如何在多个类中重写而不重复代码 (Python)

api - Odoo 新 API - 覆盖旧 API 函数字段

c# - 是否可以使用派生参数而不是基本参数来覆盖方法?

c++ - 如何在 C++ 中重载一元和二元减号运算符?

c++ - 是否可以在编译 C++ 代码期间报告每个模块的堆栈使用情况?

c++ - 我认为这是 C++11 标准中的一个(小)缺陷