为什么需要虚拟关键字?

时间:2012-11-28 08:37:53

标签: c++ virtual

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

在什么情况下,虚拟关键字不能让程序员受益?

4 个答案:

答案 0 :(得分:6)

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

virtual或动态调度的缺点是,

  • 它有轻微的性能损失。大多数编译器都会使用vtable和vptr机制实现动态调度,其中调用的相应函数是通过vtable决定的,因此在动态调度时需要额外的间接调度。
  • 它使您的课程成为非POD。

答案 1 :(得分:2)

一个原因:

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

在您的应用程序中派生类。

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

答案 2 :(得分:2)

C ++的主要设计原则之一是C++ does not incur overhead for features that are not used (the "zero-overhead principle")。这是因为关注高性能

这就是为什么你需要选择虚拟功能等功能,而在像Java这样的语言中,默认情况下功能是虚拟的。

答案 3 :(得分:0)

编译器不知道,因为它不能。您可能不打算使用虚拟功能,因为每个功能都会产生相关成本。