纯虚拟或抽象,名称是什么?


15

在讨论有关Stack Overflow上的虚拟功能的问题时,我想知道是否对纯(抽象)和非纯虚拟功能进行了正式命名。

我始终依靠Wikipedia来获取信息,其中指出纯虚函数和非纯虚函数是通用术语。不幸的是,本文没有使用来源或引用来进行备份。

引用乔恩·斯凯特(Jon Skeet)对我的答复的回答,即使用纯净和非纯净的通用术语:

@Steven:嗯...可能,但是我以前只在C ++的上下文中看过它。我怀疑任何谈论他们的人都有C ++背景:)

这些术语是否起源于C ++,或者它们是首先以较早的语言定义或实现的,并且它们是“官方”科学术语吗?

更新:

弗兰克·希亚尔(Frank Shearar)有用地提供了指向SIMULA 67 Common Base Language(1970)的描述的链接。该语言似乎是第一种将OO关键字引入为classobject以及虚拟的形式概念的语言。它没有定义纯/非纯抽象,但确实支持这些概念

谁定义的?


1
可能会发现这个有趣的东西... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver

2
虚拟函数,虚拟继承,虚拟表-没有任何关于使它们“虚拟”的真正解释。我知道规则,但是为什么要这么说呢?毕竟,“虚拟”功能与其他任何功能一样真实,仅需要后期绑定查找即可。也许Stroustrup真的很喜欢这个词。我认为类是抽象的(不是纯的),而方法可能是纯的(但不是抽象的)。不过,我有可能弥补了这一点。
Steve314,2011年

3
@ Steve314,不是Stroustrup-显然他们在Simula中已经被这样称呼了。
彼得Török

Answers:


9

Nygaard和Dahl首先在SIMULA 67 Common Base Language中使用了该术语。例如,请参阅第2.1节和第2.2.3节。(据我所知至少。但是,就OOP而言,它可能是该术语的第一个用法。)


3
Simula是第一种OO语言,即AFAIK,因此在OOP上下文中首次使用大量术语。这对Stroustrup产生了很大的影响,他最初只是想要一种具有C效率和Simula类的语言。
David Thornley

我正在浏览本文,是的,这似乎是第一篇,因为他们正在介绍“类”和“对象”。
史蒂文·杰里斯

2
因此,浪费了一些时间阅读SIMULA 67定义。Simula 67在1970年与“类”,“对象”,“隐藏”,“按值调用”,“按引用调用”一起创造了“虚拟”。没有“纯”,“不纯”或“抽象”的迹象。
史蒂文·杰里斯

5
“浪费”似乎是一个奇怪的词,用于描述阅读该领域的开创性论文之一。
Frank Shearar 2011年

7

所以...我一直在做一些研究。接下来是一些有兴趣的人的历史课程。:)如果您仅对答案感兴趣,请跳至底部的结论。

1967年

SIMULA 67,第一面向对象的程序设计语言定义的关键词作为对象通过引用呼叫由值呼叫虚拟

SIMULA的继承系统最初以不同的名称称为串联(后来称为prefix),指的是复制超级类型的代码并将其与子类型的代码“串联”的事实。后来出现了另一种形式的继承系统委托,其中通过引用正确的类型来委托调用。

虚拟最有可能是指使用虚拟方法表将调用调度到正确的实现所需要执行的过程。与固定/具体实施相比,它是虚拟的。

1971年

尼克劳斯·沃思(Niklaus Wirth)撰写了一个定义为“ 逐步完善”的概念。它从根本上解释了如何将程序划分为可以扩展的部分解决方案。

1974年

这是我发现的最早由Barbara Liskov提出的抽象数据类型一词的论文。

抽象数据类型定义一类抽象对象,该类对象完全由这些对象上可用的操作来表征。这意味着可以通过定义抽象类型的特征操作来定义该抽象类型。当程序员使用抽象数据对象时,他只关心该对象表现出的行为,而与实现如何实现该行为无关。

本文还定义了一个操作集群,该集群似乎指定了我们现在所知道的接口

有趣的科学术语(1996年发表的论文):

继承:对象或类可以共享行为或数据的一种更底层的机制。

子类型化:表示概念上的专业化。一种特定形式的继承,也称为接口继承

抽象原理:将我们对应用程序领域的知识组织到抽象顺序的层次排列中的过程,以便更好地了解所关注的现象。

部分实现的抽象:故意使定义不完整的抽象。

抽象类:面向对象系统中部分实现的类的特定术语。

非严格继承:允许在子类中重新定义(甚至删除)操作。

严格继承:行为兼容的继承。

结论

抽象类是在面向对象系统中使用的最通用的术语。似乎纯净的和非纯净的虚函数仅源自C ++。例如,对Stroustrup的这次采访使他似乎发明了这些术语。科学论文使用更通用的术语。

虚拟起源于SIMULA,这导致它的使用得到了广泛的应用,但这并不是一个通用术语。它已经定义了实现细节。说到继承类型更合适。默认情况下,非虚拟对应于默认情况下的严格继承,而默认情况下,虚拟对应于非严格继承

是否有兴趣调整Wikipedia条目?:)


在Barbara Liskov之前,Dijkstra还对“ STEP-WISE程序组成”发表了一些看法,这可能也是相关资源。
史蒂文·杰里斯

4

在C ++中,动态绑定的成员函数因而可以被子类覆盖,这些成员函数称为“虚拟”。绝对必须重写的虚函数称为“纯虚”。请注意,纯虚函数可能具有主体,尽管通常没有。具有至少一个纯虚函数的类称为“抽象”,并且不能实例化,只能从其派生。

我猜为什么将虚函数称为虚函数的原因是这样的事实,即不知道在编译时将调用哪个实际函数。从某种意义上说,在编译时虚拟函数调用“不存在”。

我还猜测,术语“抽象”用于具有纯虚函数的类的原因是您不能拥有该类的任何对象。从某种意义上说,它是一个抽象的概念,与实际的对象世界相去甚远。

编辑:其他语言。

关于“虚拟”一词的一般性问题,这是我的两分钱。在Smalltalk中,所有功能都使用动态绑定,因此它们都是虚拟的,因此不需要特殊的术语或语言关键字。在Java中,如果我没记错的话,编译器会自动决定是否应使用动态绑定,因此就程序员而言,没有区别,因此也就没有“ virtual”关键字。

在C ++中,必须区分虚拟和非虚拟,因为程序员可以决定何时应使用动态绑定来节省不需要的动态开销。


1
+1:此外,“摘要”适用于多种语言。“虚拟”不是。
S.Lott

@ S.Lott:整个问题是虚拟是否是一个通用术语。据我所知,虚拟确实适用于多种语言,并且最早是由Simula创造的。关于纯/非纯和抽象的问题仍然存在。
史蒂文·杰里斯

@Steven Jeuris:“虚拟确实适用于多种语言”吗?真。到目前为止,似乎是C,C ++和Simula。当然,一点点都不适用于Python。它似乎不适用于Java。
S.Lott

它适用于对象Pascal / Delphi。Delphi还有一个附加概念-- dynamic这是一种虚拟方法,它会以空间交换时间:与方法相比,它们占用的空间更少,执行起来也更慢virtual
Frank Shearar 2011年

2
@Steven Jeuris:“默认情况下为虚拟”与使用“虚拟”描述抽象功能不同。我认为说“所有功能都是虚拟的”的人们正在将C ++概念应用于另一种语言。而且我认为他们的做法不正确。由于所有方法函数在Python中都是虚拟的,因此从未使用“虚拟”提及该主题,除非在诸如Stack Overflow之类的地方将C ++概念应用于Python。我认为在这些情况下,virtual应用不当,因为Python语言文档不使用单词。
S.Lott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.