强制使用C++的override关键字吗?

4
我非常喜欢c++11的新override关键字,并且正在尝试在我的代码中添加它。如果编译器能帮助我发现所有这些情况,那就太好了。
有没有办法让编译器表现得好像override关键字是强制性的?我正在使用Visual Studio 2012。
例如,我希望编译器发出错误/警告:
class Base{
public:
    virtual void the_virtual(){}
};
class derive:public Base{
public:
    void the_virtual(){} //warning/error wanted here
};

在发布这个问题之前,你有看过“类似问题”的建议吗?!这个问题已经被问过不止一次了。 - Kerrek SB
我真的不想因为按照你写的做而收到警告(甚至更糟的是错误)。 - Moo-Juice
在C++0x标准化过程中的某个时刻,您可以使用class Derived explicit : public Base来实现此功能。 - Simple
1
可能是如何强制使用“override”关键字?的重复问题。 - Gabriel L.
gcc社区也有一些积极的进展。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2852.html - KRoy
1个回答

3
我会从基础开始,给这个类一个虚析构函数:编译器往往会对此发出警告。
关于实际问题,使用override的强制性要求是极不可能的,因为现有的代码需要进行大量的修改。标准委员会对这些问题的一般看法是这是一个“实现质量问题”:编译器完全可以对各种潜在问题的声明发出警告。也就是说,您可以向编译器供应商或静态分析器供应商游说,为这种情况创建一个警告。如果您认为自己无法让供应商应用检查,请自行创建!例如,使用clang检查重写虚函数时是否有override关键字非常简单。
此外,这里有一个例子,强制使用override将无法奏效:
struct Base1 {
    virtual ~Base1() {}
    virtual int f() { return 0; }
};
struct Base2 {
    int f() { return 1; }
};

template <typename Base>
struct Derived: Base { 
    int f() { return 2; }
};

int main()
{
    Derived<Base1> d1;
    Derived<Base2> d2;
}

在类模板Derived中,函数f()可能是重写函数,也可能不是。你不能有条件地在那里放置override

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接