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

C++ 为什么不能在C+;中将非虚方法定义为final+;11?,c++,c++11,C++,C++11,今天,当我得知C++11终于知道了final关键字时,我非常高兴。有了它,您可以轻松地将整个类定义为最终的甚至单个虚拟方法。但我想知道为什么非虚拟方法不可能做到这一点?让我们举一个例子: class A { public: void m1() { cout << "A::m1" << endl; }; virtual void m2() { cout << "A::m2" << endl; };

今天,当我得知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; };
};
A类{
公众:

void m1(){cout根据C++11标准,明确不允许对函数执行此操作。相关段落在§9.2/8中:

virt说明符seq最多应包含每个virt说明符中的一个。virt说明符seq仅应出现在虚拟成员函数声明中(10.3)

virt说明符包括
final
override

我的猜测是,他们认为在非虚拟函数中使用这些说明符没有意义,因为默认情况下,非虚拟函数是
final
,它们是“final overrider”,正如其他部分中的标准所述

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


我建议您不要使用虚拟函数,因为虚拟函数对代码有不同的影响,您可能不需要。例如,该类现在必须保留一个vtable并失去其POD状态。总体而言,如果您只想使用
final
关键字,这似乎是一个糟糕的举动。

因为非虚拟方法已经是final了。您不能越界删除它们,你只能隐藏它们。@Bryan是的,你是对的,但这仍然是我想要阻止的。我改变了问题以澄清这一点。可能的重复通常无法阻止函数隐藏。你可以在类B中,使用
声明插入任何不想隐藏的函数。如果有没有技术上的理由保护一个方法/类不被final覆盖。在final关键字出现后,我在库中看到了很多带有final的代码。在扩展使用类/方法时,我们必须将它们全部删除。如果我们在代码中找到final,这感觉有点像是由一个聪明的alec编写的。通常是e代码不知道该方法是否真的是最终方法:-)我们的编码标准包含一个不使用final的标志。我个人认为final通常比goto更错误!一个不重写的
虚拟final
方法没有合理的理由拥有vtable;我希望大多数实现都会放弃,仍然拥有vtable。(遗憾的是,没有一个
new
关键字声明此方法不会重写,否则
virtualfinal new
将是一种有趣的方式,可以保证调用方法时的非虚拟行为)