缺少虚拟关键字的警告

Jon*_*tor 7 c++ g++

我最近遇到了一个令人沮丧的问题,归结为一个非常简单的编码错误.请考虑以下代码:

#include <iostream>

class Base
{
public:
    void func() { std::cout << "BASE" << std::endl; }
};

class Derived : public Base
{
public:
    virtual void func() { std::cout << "DERIVED" << std::endl; }
};

int main(int argc, char* argv[])
{
    Base* obj = new Derived;
    obj->func();
    delete obj;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

基础

显然(对于这种情况),我的意思是将虚拟关键字放在Base :: func上,以便在main中调用Derived :: func.我意识到这可能(可能)是由c ++标准允许的,并且可能有充分的理由,但在我看来,99%的时间这将是一个编码错误.但是,当我使用g ++和我能想到的所有-Wblah选项编译时,没有生成任何警告.

有什么方法可以在基类和派生类都具有相同名称的成员函数时生成警告,其中派生类的函数是虚函数而基类的函数不是?

Aar*_*ron 5

在Visual C++中,您可以使用override扩展名.像这样:

virtual void func() override { std::cout << "DERIVED" << std::endl; }
Run Code Online (Sandbox Code Playgroud)

如果函数实际上没有覆盖基类方法,则会出错.我将它用于所有虚拟功能.通常我定义一个像这样的宏:

#ifdef _MSC_VER
#define OVERRIDE override
#else
#define OVERRIDE
#endif
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用它:

virtual void func() OVERRIDE { std::cout << "DERIVED" << std::endl; }
Run Code Online (Sandbox Code Playgroud)

我用g ++找了这样的东西,却找不到类似的概念.

我在Visual C++中唯一不喜欢它的是你不能让编译器在所有被覆盖的函数上都需要它(或者至少要警告它).

  • 请注意`override`在c ++ 11中,因此可以在c ++ 11模式下使用最近的gcc和clang(`-std = c ++ 11`) (2认同)