gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:20:57 26 4
gpt4 key购买 nike

今天我很高兴得知 C++11 现在终于知道了 final 关键字。有了它,您可以轻松地将整个类定义为 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::m2 声明为 final 来轻松防止 B 覆盖虚拟 m2。我想对 A::m1 做同样的事情,所以 B 不能用它自己的方法实现来隐藏 A:m1 。但是编译器不接受没有 virtualfinal 关键字。我想知道 C++11 是否有理由不允许这样做,以及我是否完全误解了某些东西。在我看来,将非虚拟方法定义为 final 非常有意义,因为我没有将它声明为虚拟,因为我不希望其他人覆盖/隐藏它(我现在可以使用 final 但不幸的是仅适用于虚拟方法...)

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

最佳答案

根据 C++11 标准,明确不允许您对函数这样做。相关段落在 § 9.2/8 下:

A virt-specifier-seq shall contain at most one of each virt-specifier. A virt-specifier-seq shall appear only in the declaration of a virtual member function (10.3).

virt-specifier 包括 finaloverride

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

It looks like this means I have to declare all methods as virtual now to be able to do that. Is that a good idea or are there reasons against it?

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

关于c++ - 为什么不能在 C++11 中将非虚拟方法定义为 final?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24545729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com