java - 为什么不能过度使用虚函数?

标签 java c++ virtual-functions

我刚刚读到我们不应该过度使用虚函数。人们认为,较少的虚拟功能往往会产生较少的错误并减少维护。

虚函数会出现什么样的bug和缺点?

我对 C++ 或 Java 的上下文感兴趣。


我能想到的一个原因是由于 v-table 查找,虚函数可能比普通函数慢。

最佳答案

您发布了一些笼统的陈述,我认为大多数务实的程序员会因为被误导或误解而耸耸肩。但是,确实存在反虚拟狂热者,他们的代码可能同样不利于性能和维护。

在 Java 中,默认情况下一切都是虚拟的。说你不应该过度使用虚函数是相当强的。

在 C++ 中,您必须声明一个虚拟函数,但在适当的时候使用它们是完全可以接受的。

I just read that we should not use virtual function excessively.

很难定义“过度”...当然“在适当的时候使用虚函数”是个好建议。

People felt that less virtual functions tends to have fewer bugs and reduces maintenance. I'm not able to get what kind of bugs and disadvantages can appear due to virtual functions.

设计不佳的代码很难维护。期间。

如果您是库维护者,正在调试隐藏在高层次类层次结构中的代码,则可能很难跟踪代码实际执行的位置,如果没有强大的 IDE 的好处,通常很难判断哪些类覆盖行为。它可能导致在跟踪继承树的文件之间跳来跳去。

所以,有一些经验法则,但都有异常(exception):

  • 保持层次结构浅。高大的树木会使类(class)困惑。
  • 在 C++ 中,如果您的类具有虚函数,请使用虚析构函数(如果没有,则可能是错误)
  • 与任何层次结构一样,在派生类和基类之间保持“is-a”关系。
  • 您必须注意,可能根本不会调用虚函数......所以不要添加隐含的期望。
  • 有一个很难争论的例子是虚函数更慢。它是动态绑定(bind)的,所以经常出现这种情况。在它所引用的大多数情况下,它是否重要当然值得商榷。改为分析和优化 :)
  • 在 C++ 中,不要在不需要时使用 virtual。将功能标记为虚拟涉及语义 - 不要滥用它。让读者知道“是的,这可能会被覆盖!”。
  • 更喜欢纯虚拟接口(interface)而不是混合实现的层次结构。它更简洁,更容易理解。

实际情况是,虚函数非常有用,而这些疑点不太可能来自平衡的来源——虚函数已经被广泛使用了很长时间。更多的新语言将它们作为默认设置。

关于java - 为什么不能过度使用虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050811/

相关文章:

android - 基类成员函数直接访问子类成员函数?

java - SQLiteDatabase Android 中出现 java.lang.NullPointerException 错误

java - 如何使用 Spring/AJAX 基于另一种方法使 Spring 中的 session 无效

C++ 不同的模板方法在同一个变量上调用

c++ - std::vector 如何支持未知大小的自定义对象的连续内存

templates - 虚函数可以用auto参数代替吗?

子类中未调用 C++ 虚函数

java - 有没有更简洁的方法在 Java 中编写多个 if 语句

java - 为用户定义的 Oracle 表类型编写 MyBatis3 TypeHandler

c++ - 为什么 GMOCK 对象不返回依赖注入(inject)中 EXPECT_CALL 设置的值