我经常看到人们抱怨 C++ 中的虚函数开销。但同样的人不会对 java 中的运行时多态性说任何负面的话。
如果我必须在 c++ 中开发一个运行时,该运行时在其上托管同样用 c++ 开发的应用程序,我将采用以下方法:
- 具有带有虚拟方法的基类,它们代表“抽象”应用程序。这是运行时的应用程序视图。应用程序开发人员继承基类并将其应用程序编译为可动态加载的共享库。
- 具有带有虚拟方法的基类,它代表运行时的“服务”。运行时实现这些服务。应用程序通过这些接口类使用这些服务。运行时加载应用程序动态库并使用其服务的实现对象初始化应用程序。
现在应用程序和运行时都有彼此的句柄,并使用虚拟方法调用互相调用。是的,这涉及到成本,但这也让我们将应用程序与运行时解耦。如果没有虚拟方法,应用程序将始终与运行时具有链接时间依赖性。
现在考虑 Java 中的类似情况。Java 也有需要实现的接口,并且涉及的运行时多态性必须有类似的成本。
我对 java 运行时多态性的理解正确吗?
如果 java 也有成本,为什么 c++ 总是会得到愤怒的评论:“哦,有虚函数成本,使用虚函数来解耦应用程序部分的方法肯定很糟糕”。万一Java,这些人会去哪里?他们什么也没说。
我的问题是如何处理这些评论?可以给出哪些合理的论据来支持 C++?