为什么C++中的虚函数被称为“虚拟函数”?

10

我对C++中的虚函数这个概念还很陌生,像这样的线程很好地介绍了这个概念。好的,我被说服了。

但是为什么称虚函数为“虚拟”?我觉得这样的函数和普通函数/方法一样“具体”,不是吗?如果有人能解释一下使用“虚拟”这个词来命名这个概念的原因,那就太好了。


@H2CO3 在任何意义上都没有重载。重载是指具有相同名称但接受不同参数的函数。 - rubenvb
@rubenvb 正确 -- 我会更新我的评论。 - user529758
@H2CO3 很好!我提到这个的原因是因为一个有运行时开销,而另一个没有 ;) - rubenvb
@rubenvb 所以我会将我的评论复制为答案 :) - user529758
1
@H2CO3 哦,override是C++11中的一个新关键字,它是一个“在特定上下文中出现时具有特殊含义的标识符”。 - rubenvb
@rubenvb 这可能是正确的,但那么我用什么词来描述一个可以被子类覆盖的函数呢? - user529758
2个回答

12

Virtuality(虚拟性),指具备某物的属性,但并未共享其(真实或想象中的)物理形态。

^ http://en.wikipedia.org/wiki/Virtual

C++ 的虚函数看起来像是一般的函数(“具备了属性”),但被调用的实现不是通过声明或内联实现来共享的。


谢谢你的回答。你能解释一下“不通过声明共享”的意思吗? - curiousexplorer
“not shared out via the declaration” 意味着信息没有提供。声明不提供有关在任何给定(虚拟)函数调用中将调用哪个实现的信息。可以通过限定调用来使调用不是虚拟的,例如 p->SomeClass::aMethod(),但即使在这种情况下,SomeClassaMethod 声明也不能告诉你将调用哪个实现。有一个例外,即 C++11 中的 final 方法,它无法被覆盖,当 final 版本也是该方法的原始引入时。但那是病态的... - Cheers and hth. - Alf
1
这个关于不提供信息的语句也适用于非虚拟、非内联成员函数,事实上大多数函数都适用。C++中的虚拟函数特指根据对象的运行时类型进行调度。 - Bryan
@Bryan:你的第二个陈述是正确的,因此你的第一个陈述是不正确的。 - Cheers and hth. - Alf
我认为你在这些话中读入了更多的东西。如果我声明一个在DLL中实现的C函数,那么这个声明并不能告诉你关于实现的任何信息;它取决于哪个DLL被加载。然而,这并不涉及虚函数。 - Bryan
@Bryan:DLL和其他动态库,如Unix SO,不是标准C++的一部分。如果你所说的“深入了解”是指“虚拟”这个词,那么它的意思是普遍的。这就是为什么我在上面引用了维基百科的原因。 - Cheers and hth. - Alf

11
“虚函数”是指一种成员函数,其具体实现取决于调用它的对象类型,在运行时确定。编译器和语言运行时支持共同合作实现这一机制。
C++中的关键字“virtual”取自Simula语言,该语言给Bjarne Stroustrup留下了深刻印象。更多背景信息请参见:Pure virtual or abstract, what's in a name?

..SIMULA 67 Common Base Language(1970)..似乎是第一个引入面向对象关键字如“class”、“object”,以及正式概念“virtual”的语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接