- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我只是偶然看到了标题中的陈述。完整的报价是:
As a rule of thumb, make all your methods virtual (including the destructor, but not constructors) to avoid problems associated with omission of the virtual keyword.
我在 Wrox 的书Professional C++中找到了这个。 You can google it to check.
这有什么关系吗?我原以为您只会提供选择的扩展点,而不是默认的可扩展性。例如,a 2001 article by Herb Sutter says so .从那以后,有什么发生了巨大的变化,使相反的统治规范成为了主流吗? (请注意,我是 C++ 菜鸟,所以在过去的十年里我没有关注过这个讨论。)
最佳答案
Is there anything to it?
建议不好,这是毫无疑问的。阅读这样的内容就足以让您远离这本书及其作者。
你看,virtual 关键字表示“你可以或应该重写这个方法——它是为此而设计的”。
对于任何重要的任务,我无法想象一个合理的类系统允许用户(即其他程序员)覆盖每个派生类中的每个单独的方法。拥有只有虚拟方法的基本抽象类是正常的。然而,一旦你开始创建派生类,就没有理由将“虚拟”应用到所有东西上——有些方法不需要是可扩展的。
使一切都成为虚拟意味着在任何代码点,无论调用哪个方法,您都无法确定该类会执行您想要的操作,因为有人可能重写了您的方法,在过程中破坏了它(根据根据墨菲定律,它会发生)。这将使您的代码不可靠,并且难以维护。另一个非常有趣的事情是在构造函数中调用虚方法的方式。基本上,通过遵循这个建议,你牺牲了代码的可读性/可靠性,以换取不做一个非常罕见的错字。在我的看来,这不值得。
相比之下,非虚拟方法保证无论发生什么,在这个代码点上,代码将始终按您的预期工作(不包括您尚未发现的错误)。 IE。其他人不会用损坏的替代方法代替您的方法。
该建议提醒了我一些新手程序员往往会犯的一个常见错误:他们没有开发能够解决问题的简单解决方案,而是分心并试图使代码具有通用性和可扩展性。因此,项目需要更长的时间才能完成或永远无法完成 - 因为与仅限于当前问题的本地化解决方案相比,针对每种可能场景的通用解决方案需要更多的工作/开发时间。
我建议不要遵循这个“虚拟”建议,而是坚持使用 Murphy's Law。和 KISS principle .他们为我工作得很好。但是,不能保证它们适用于其他所有人。
关于c++ - C++ 中的 "As a rule of thumb, make all your methods virtual"- 合理的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660207/
我是一名优秀的程序员,十分优秀!