当前位置: 首页 > 面试题库 >

为什么不具有C ++中所有虚拟功能?

荆利
2023-03-14
问题内容

我知道虚函数具有取消引用调用方法的开销。但是我想以现代建筑的速度几乎可以忽略不计。

  1. 为什么C ++中的所有函数都不像Java中的虚拟函数那样有特定的原因?
  2. 据我所知,在基类中定义虚拟函数是足够/必要的。现在,当我编写父类时,我可能不知道哪些方法会被覆盖。这是否意味着在编写子类时,有人必须编辑父类。这听起来不方便,有时甚至不可能?

更新:
以下是乔恩·斯凯特(Jon Skeet)的回答:

这是在明确地使某人意识到他们正在继承功能[这本身具有潜在的风险[(检查Jon的响应)] [和潜在的小小的性能提升]之间 的权衡与
较低的灵活性,更多的代码更改以及更陡峭的学习曲线。

不同答案的其他原因:

虚拟函数无法内联,因为内联必须在运行时进行。当您期望内联函数对您有所帮助时,这会对性能产生影响。

可能还有其他原因,我很想知道和总结它们。


问题答案:

有充分的理由来控制哪些方法是超出性能的虚拟方法。尽管 实际上 我的大多数方法并没有最终在Java中完成,但我可能应该…除非 设计
为要重写的方法,否则可能不应该是虚拟IMO。

为继承而设计可能很棘手-特别是,这意味着您需要更多地记录可能叫什么以及可能叫什么的内容。想象一下,如果您有两个虚拟方法,并且其中一个调用了另一个方法-
必须
将其记录下来,否则有人可以使用调用“调用”方法的实现来覆盖“被调用”方法,而在不知不觉中创建堆栈溢出(如果存在,则为无限循环)尾调用优化)。到那时,您在实现中的灵活性就会降低-
您以后无法再进行调整了。

请注意,C#在各种方面都类似于Java,但是默认情况下选择使方法为非虚拟的。其他人并不热衷于此,但我当然欢迎它-我实际上更希望默认情况下类也是不可继承的。

基本上,这可以归结为乔什·布洛赫(Josh Bloch)的建议:为继承而设计或禁止继承。



 类似资料:
  • 问题内容: 导入标准“日志记录”模块会对一堆虚拟条目造成sys.modules污染: 因此,导入此软件包会将额外的名称放入sys.modules中,除了它们不是模块以外,仅引用None。其他模块(例如xml.dom和编码)也有此问题。为什么? 编辑: 在bobince的答案的基础上,有一些页面描述了功能的起源(请参阅“ sys.modules中的虚拟条目”部分)和功能的未来。 问题答案: 中的值是

  • 在Azure中,有2个选项可用于创建虚拟机。A、 普通VM B.经典VM 有人知道这两种选择有什么区别吗?我们什么时候使用一个而不是另一个?

  • 问题内容: 我希望有人能够提供一些有关Java虚拟机的根本差异的见解,从而使Java虚拟机可以很好地实现线程而无需使用全局解释器锁(GIL),而Python则需要这样做。 问题答案: Python(该语言)不需要GIL(这就是为什么它可以在JVM [Jython]和.NET [IronPython]上完美实现的原因,并且这些实现可以自由地使用多线程)。CPython(流行的实现)一直使用GIL来简

  • 本文向大家介绍react的虚拟DOM和vue的虚拟DOM有什么区别?相关面试题,主要包含被问及react的虚拟DOM和vue的虚拟DOM有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 React 是数据先生成 vdom,然后对比 vdom(实现上并非先后顺序,两棵树边遍历边生成新的树),最后通过新的 DOM 树渲染。 Vue 是数据先进性对比,先通过数据的不同,再去更新 vdom(这不知道

  • 问题内容: 为什么数据存储Redis具有发布/订阅功能?我首先想到的是实现这样的事情是错误的层。但也许我需要跳出框框思考。 问题答案: Redis被定义为数据结构服务器。Redis提供了多种功能,例如内存缓存,队列,发布订阅等。这对于cloudapp / webstack非常有用,其中3个组件RabbitMQ(排队)+ XMPP(发布订阅)+内存缓存目前可以用redis代替。排队功能不如Rabbi

  • 问题内容: 使用ant,maven和buildr有什么意义?在eclipse或netbeans中使用using构建会无法正常工作吗?我很好奇扩展构建工具的目的和好处是什么。 问题答案: 依赖管理 :构建工具遵循组件模型,该组件模型提供有关在哪里寻找依赖的提示。在Eclipse / Netbeans中,您必须依赖JAR,并且您实际上并不知道此JAR是否已更新。使用这些构建工具,它们“知道”依赖项中的