今天,当我了解到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是非常有意义的,因为我没有将它声明为虚拟,因为我不希望其他人覆盖/隐藏它(我现在可以强制实施但不幸的是仅用于虚拟方法...)m2
A::m2
A::m1
B
A:m1
final
virtual
final
我喜欢类设计,除抽象方法之外的所有东西都是最终的 看起来这意味着我必须virtual
现在声明所有方法才能做到这一点.这是一个好主意还是有理由反对它?对于较旧的C++版本,我经常读到将所有方法声明为虚拟的一个坏主意.或者可能有更好的方法来防止隐藏非虚拟方法?
根据C++ 11标准,您明确不允许对函数执行此操作.相关段落见§9.2/ 8:
一个的virt-符-SEQ应包含每个最多一个的virt-符.甲的virt说明符-SEQ应仅在一个虚拟的成员函数(10.3)的声明出现.
甲的virt说明符包括final
和override
.
我的猜测是他们认为这些说明符在非虚函数中使用没有意义,因为非虚函数是final
默认的,并且它们是其他部分中的标准状态的"最终覆盖".
看起来这意味着我必须将所有方法声明为虚拟现在能够做到这一点.这是一个好主意还是有理由反对它?
我建议不要这样做 - 因为虚拟功能对你可能不需要的代码有不同的影响.例如,该类现在必须保留vtable并丢失其POD状态.总的来说,如果您只是想使用final
关键字,这似乎是一个糟糕的举动.
归档时间: |
|
查看次数: |
2288 次 |
最近记录: |