为什么我们使用'virtual'关键字(词源)?

时间:2011-02-15 09:30:52

标签: language-agnostic virtual

大多数修饰符对我来说都是有意义的 - 抽象,受保护等。但“虚拟”对于真正“可覆盖”的东西来说似乎是一个令人困惑的任意选择。

计算中的“虚拟”(虚拟机,虚拟内存)似乎意味着某种东西的抽象表示。我猜这是源于光学,其中虚拟图像(通常在* vert * ed)本身来自中世纪拉丁语virtuālis,意思是“有效”。

所以在我看来,如果计算中的'虚拟'方法是最重要的方法,而不是一个被覆盖的方法,那将更有意义。

也许我错过了一些关于'虚拟'的基本信息,任何人都可以更清楚地了解它为何被选中吗?

3 个答案:

答案 0 :(得分:9)

我倾向于认为“虚拟”一词意味着不真实。例如,就虚拟内存而言,在某些时候将映射到实际内存,但在需要映射之前它实际上是一个占位符。

类似地,虚函数是一个占位符,可以在某个时刻映射到实际函数。

即使你使用(有点幼稚)“假装”定义,它也是有道理的:

virtual/pretend machine
virtual/pretend memory
virtual/pretend function

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

答案 1 :(得分:1)

当你说,

  

“虚拟”对于真正“可覆盖”的内容来说似乎是一个令人困惑的任意选择

我同意'overridable'可能是一个更好的关键字,但我不认为'virtual'是任意的。我认为使用它有一个很好的,历史上合理的理由。

一些例子C ++:

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

C *cp;

...

cp->x();

cp->x()会调用真实代码,因此我认为abstract不是正确的单词。 但它会调用哪些代码?仅仅因为cp是指向C的指针并不意味着它 无法从C指向继承的内容。

请参阅调用已虚拟化。就像映射虚拟内存地址一样 对于实际内存地址,虚函数调用被映射到实际函数 通过虚方法表调用。

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

现在,想象一下虚拟方法调用是一个全新的想法。你可以想象 在创造一种拥有它们的新语言的所有令人兴奋的兴奋中 内置于(!!!),人们自然会想到使用该关键字。

可怜的C::x()在所有这些兴奋中都是无辜的旁观者。使用 virtual关键字告诉编译器对方法的调用将被虚拟化,但显然没有“虚拟”或“抽象” 关于C::x()本身。这只是可怜的傻瓜被卡住了默认 方法表中的方法。

现在这只是猜想,但也许C ++使用这个术语的原因 “纯虚拟”用于描述重写的方法。也许具体 类型C的对象不使用虚方法调用,即使对于“虚拟”方法也是如此。 当然,纯虚拟方法总是必须通过a来调用 虚方法表。

答案 2 :(得分:0)

考虑以下代码行:

base.Method();

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

如果Method()是一个虚方法,那么我们不直接调用函数Method()。相反,我们被“重定向”到实际功能,具体取决于基础。

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