我真的没有看到覆盖非虚方法的一点,因为它会产生一系列潜在的错误,有时会调用原始基础,有时会调用子方法。
遵循这个逻辑,制定一个方法总是有一个简单的规则:
这种方法可以被覆盖吗?如果是,请将其标记为virtual
,否则请将其标记为final
。
对我而言,一切听起来都不错,但我想知道我是否真的错过了一些重要的事情以及为什么没有其他人遵循这个简单的规则?
答案 0 :(得分:1)
你是绝对正确的,你编写的每个成员函数必须明确设计为被覆盖,或者是不变的。但是,虚拟性是您必须在层次结构的最顶层添加的东西;你不能在中间添加它。但是,你可以带走"带走"通过标记虚拟成员函数final
来降低此类的虚拟性。
由于final
只能应用于虚拟成员函数,因此我们在下面的讨论中不会考虑非虚拟成员函数。
一种常见的做法是设计一个直接使用或继承的类,但不是两者都有,即当你没有在继承层次结构的中间实例化类,而你没有从" leaf"层次结构的类。这个实践已经被More Effective C++书第33项推广。如果你遵循这种做法,你应该标记final
叶子类的所有虚函数,让编译器帮助你找到所有违反规则的行为。
答案 1 :(得分:1)
一个包含非虚函数的程序,它的每个非虚函数都是final
并遵循C ++标准,保证完全没有错误。
所以就是这样。
仍然:我建议反对它。
它也不存在。 final
位置关键字只能应用于virtual
个功能。第一段被称为一个空洞的满足笑话:一个不存在的东西的每个例子都有每个属性,因为没有例子。
创建一个非重写的virtual final
函数会让阅读它的人感到困惑。它会阻止后代类型声明具有相同签名的方法:但它不会阻止略微不同的签名,因此它几乎没有意义。