为什么不能在C++ 11中将非虚方法定义为final?

kay*_*ahr 12 c++ c++11

今天,当我了解到C++ 11现在终于知道final关键字时,我感到非常高兴.有了它,您可以轻松地将整个类定义为最终甚至单个虚拟方法.但我想知道为什么非虚拟方法不可能这样做?我们来看这个例子:

class A {
public:
    void m1() { cout << "A::m1" << endl; };            
    virtual void m2() { cout << "A::m2" << endl; };      
};

class B : public A {
public:
    void m1() { cout << "B::m1" << endl; };
    virtual void m2() { cout << "B::m2" << endl; };
};
Run Code Online (Sandbox Code Playgroud)

在这里,我可以轻松地通过声明为最终来阻止B覆盖虚拟.我想做同样的事情,所以无法隐藏它自己的方法实现.但是编译器不接受没有的关键字.我想知道是否有一个理由为什么C++ 11不允许这样做,如果我完全误解了一些东西.在我看来,将非虚拟方法定义为final是非常有意义的,因为我没有将它声明为虚拟,因为我不希望其他人覆盖/隐藏它(我现在可以强制实施但不幸的是仅用于虚拟方法...)m2A::m2A::m1BA:m1finalvirtualfinal

我喜欢类设计,除抽象方法之外的所有东西都是最终的 看起来这意味着我必须virtual现在声明所有方法才能做到这一点.这是一个好主意还是有理由反对它?对于较旧的C++版本,我经常读到将所有方法声明为虚拟的一个坏主意.或者可能有更好的方法来防止隐藏非虚拟方法?

Rap*_*ptz 5

根据C++ 11标准,您明确不允许对函数执行此操作.相关段落见§9.2/ 8:

一个的virt-符-SEQ应包含每个最多一个的virt-符.甲的virt说明符-SEQ应仅在一个虚拟的成员函数(10.3)的声明出现.

的virt说明符包括finaloverride.

我的猜测是他们认为这些说明符在非虚函数中使用没有意义,因为非虚函数是final默认的,并且它们是其他部分中的标准状态的"最终覆盖".

看起来这意味着我必须将所有方法声明为虚拟现在能够做到这一点.这是一个好主意还是有理由反对它?

我建议不要这样做 - 因为虚拟功能对你可能不需要的代码有不同的影响.例如,该类现在必须保留vtable并丢失其POD状态.总的来说,如果您只是想使用final关键字,这似乎是一个糟糕的举动.