为什么我们在IT技术中使用“virtual”关键字(词源学上的)?

9
大多数修饰符对我来说都很清晰-抽象、受保护等。但是,“virtual”似乎是一个令人困惑的任意选择,实际上它应该是“可重写”的意思。
在计算机领域中,“virtual”(虚拟机、虚拟内存)似乎意味着某物的抽象表示。我猜这源自光学,其中虚像(通常是倒置的)本身来自中世纪拉丁语virtuālis,意为“有效的”。
因此,在计算机领域中,“virtual”方法如果是覆盖方法而不是需要被覆盖的方法,那么它似乎更有意义。
也许我对“virtual”还有什么基本的误解,是否有人能够进一步解释为什么选择了它?

1
+1 这是一个非常好的问题。我真的很想知道结果。 - templatetypedef
1
这个问题是否更适合在Programmers.SE上提问? - Lasse V. Karlsen
对于好奇的人来说,虚拟(virtūs)的根源与反转(vertere)毫无关系。 - Party Ark
4
我投票关闭此问题,因为这个问题不是关于实际编程问题的,如[帮助/主题]中所述。 - Martijn Pieters
3个回答

9
我倾向于将“虚拟”一词解释为不真实。例如,在虚拟内存方面,它在某些时刻映射到真正的内存中,但实际上只是一个占位符,直到需要映射为止。
同样地,虚函数是一个占位符,它在某些时刻映射到真正的函数中。
即使您使用(有点幼稚的)“假装”定义,这也是有意义的:
virtual/pretend machine
virtual/pretend memory
virtual/pretend function

在所有这些情况下,“虚拟”的意思是并不真实的。它们的使用被转化为真实的东西(模拟机器,通过MMU映射内存地址,调用类特定的“实际”函数而不是虚拟函数等等)。

谢谢。但是,只有在您将虚拟视为抽象的方式时,这才有意义;也就是说,您期望被覆盖的东西。在这种情况下,您会从一开始就将其定义为抽象!在您提到内存的例子中,与编程的类比是虚拟内存“覆盖”了实际内存。但在编程中,我们称真正的东西为“虚拟”,这与我的预期相反。 - Party Ark
1
让我澄清一下我的意思。我认为你的描述是正确的,但是从我的角度来看,你把真实/虚拟搞混了。我的观点是,基类中的函数是虚拟的,因为在调用它的时候,它实际上会映射到派生类中的真实函数(当然,前提是该类已经被派生出来)。 - paxdiablo

1

当你说:

“虚拟”似乎是一个混淆的任意选择,实际上它应该被称为“可重写”

我同意,“可重写”可能是一个更好的关键字,但我不认为“虚拟”是随意的。我认为使用它有一个很好的、历史上可信的原因。

下面是一些C++的示例:

class C {
    virtual int x() { ... }
    ...
}

C *cp;

...

cp->x();

cp->x()会调用真正的代码,所以我不认为abstract是正确的词。 但它将调用哪个代码呢?仅因为cp是指向C的指针,并不意味着它不能指向从C继承的东西。

注意,该调用是虚拟化的。就像虚拟内存地址被映射到实际内存地址一样,虚函数调用通过虚方法表被映射到实际函数调用。

根据谷歌的说法,虚拟意味着“几乎或接近描述,但并非完全或按照严格定义”。考虑到虚方法调用几乎像真实的方法调用一样,除了一些重定向,我认为这是个相当不错的形容词。

现在,想象当虚方法调用是一个全新的概念时。你可以想象,在创建具有这些功能的新语言的所有兴奋中,人们自然会想要使用那个关键字。

C::x()在所有这些激动中都是一个无辜的旁观者。使用virtual关键字告诉编译器对该方法的调用将被虚拟化,但显然C::x()本身并没有什么“虚拟”或“抽象”的东西。它只是那个倒霉的家伙,被卡在了方法表中成为默认方法。

现在这只是一种推测,但也许C++使用术语“纯虚拟”来描述必须被覆盖的方法是有原因的。也许类型为C的具体对象甚至不使用“虚拟”方法调用,“虚拟”方法。当然,纯虚拟方法必须始终通过虚拟方法表调用。


0

考虑下面的代码行:

base.Method();

其中base是Base或其子类的实例化。

如果Method()是虚方法,则我们不直接调用函数Method()。相反,我们会根据base的内容“重定向”到实际函数。

因此,“虚拟”一词并不试图描述在基类中声明的函数本身。它实际上描述了我们想要抽象出函数的调用这一事实。


如果我们想要抽象函数的调用,那么我们一开始就应该将其描述为抽象的,使用这个关键字对我来说是有意义的。但是通过将其描述为“虚拟的”,这意味着它与实际可抽象的“真实”函数相反。因此,将派生方法称为虚拟的更有意义。 - Party Ark

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