【发布时间】:2016-12-27 23:16:58
【问题描述】:
我使用 C++ 才 2~3 个月,最近我发现了标识符 final,它出现在虚函数之后。时至今日,我认为省略virtual会阻止虚拟性的传播,但我错了。它隐式传播。
我的问题是这样的。为什么允许隐式传播?为什么 virtual 的存在不能使函数虚拟,而 virtual 的存在不能使函数不虚拟?在某些情况下更好吗?还是在virtual首次推出的那一天?
根据Clifford's answer,甚至有一个编译器会在缺少virtual时生成警告。
why is the virtuality of methods implicitly propagated in c
我希望上面的链接能回答我的问题,但它没有。
------------ 加法-------------
有一些关于询问此功能的有用性的cmets。 我认为虚函数上的 final 关键字是对函数进行虚拟化的原因。该函数不能再被覆盖,因此派生类必须重新声明一个函数,无论它是否具有相同的名称。 如果 final 与去虚拟化不同,请帮我理解一下。 如果 final 没有什么不同,那么从引入 final 的事实来看,去虚拟化的用处是不言而喻的。 我同意强制显式 virtual 会产生错误,但我很好奇是否还有其他原因。
【问题讨论】:
-
停止传播有什么用处并不明显。你有一个令人信服的例子吗? (请注意,
final比“在此处停止虚拟传播”要强大得多。) -
@Sgene9 “无论我想去哪里”都不是有用的例子,更不用说令人信服了。发布一个具体情况并解释这将如何解决实际问题。
-
如果
vehicle->go()调用Car::go()而不是Toyota::go(),那会很混乱 -
允许子类使相同的函数成为非虚拟函数将违反 liskov 替换原则。在这样做时,您会强制子类引入特殊的技巧,以在对其进行操作之前检查某物的类型,并引入不必要的复杂性和出错的机会。想象一下,如果您通过引用基类将对象传递给函数,结果调用的函数与您预期的不同。会很混乱!
-
它不能用相同的签名声明 foo。这就是重点。它可以用不同的签名声明它,但不会被覆盖。
标签: c++ methods virtual propagation