5

换句话说,为什么编译器不只是“知道”如果派生类中函数的定义发生了更改,并且指向该派生类的动态分配内存的指针调用了更改后的函数,那么该函数尤其应该被称为而不是基类的?

在什么情况下,virtual 关键字对程序员没有好处?

4

4 回答 4

6

virtual关键字告诉编译器实现动态调度。这就是语言的设计方式。如果没有这样的关键字,编译器将不知道是否要实现动态调度。

一般来说,动态调度的缺点virtual是,

  • 它有轻微的性能损失。大多数编译器会使用 vtable 和 vptr 机制实现动态调度,其中要调用的适当函数是通过 vtable 决定的,因此在动态调度的情况下需要额外的间接。
  • 它使您的课程成为非 POD。
于 2012-11-28T08:43:40.653 回答
2

一个理由:

考虑位于单独模块中的基类,例如库。

以及应用程序中的派生类。

编译器在编译库期间如何知道给定函数是/必须是虚拟的。

于 2012-11-28T08:43:20.250 回答
2

C++ 的主要设计原则之一是C++ 不会为未使用的功能产生开销(“零开销原则”)。这是因为专注于高性能

这就是为什么您需要选择虚拟函数等功能,而在 Java 等语言中,函数默认是虚拟的。

于 2012-11-28T09:11:50.037 回答
0

编译器不知道,因为它不知道。不使用虚拟功能可能是您的意图,因为每个功能总是有相关的成本。

于 2012-11-28T08:41:11.120 回答