换句话说,为什么编译器不只是“知道”如果派生类中函数的定义发生了更改,并且指向该派生类的动态分配内存的指针调用了更改后的函数,那么该函数尤其应该被称为而不是基类的?
在什么情况下,virtual 关键字对程序员没有好处?
virtual
关键字告诉编译器实现动态调度。这就是语言的设计方式。如果没有这样的关键字,编译器将不知道是否要实现动态调度。
一般来说,动态调度的缺点virtual
是,
一个理由:
考虑位于单独模块中的基类,例如库。
以及应用程序中的派生类。
编译器在编译库期间如何知道给定函数是/必须是虚拟的。
C++ 的主要设计原则之一是C++ 不会为未使用的功能产生开销(“零开销原则”)。这是因为专注于高性能
这就是为什么您需要选择虚拟函数等功能,而在 Java 等语言中,函数默认是虚拟的。
编译器不知道,因为它不知道。不使用虚拟功能可能是您的意图,因为每个功能总是有相关的成本。