純粋な仮想または抽象、名前は何ですか?


15

Stack Overflowの仮想関数に関する質問について議論しているときに、純粋な(抽象的な)仮想関数と非純粋な仮想関数の正式な命名法があるかどうか疑問に思いました。

私の情報は常にウィキペディアに依存しており、純粋な仮想関数と非純粋な仮想関数が一般的な用語であると述べています。残念ながら、この記事では、起源や参考文献でバックアップしていません。

純粋で非純粋が一般的な用語であるという私の返信に対するJon Skeetの回答を引用するには:

@スティーブン:うーん...多分、しかし私はC ++のコンテキストでそれを見たことがあります。私はそれらについて話している人はC ++のバックグラウンドを持っている可能性が高いと思う:)

これらの用語はC ++に由来していましたか、それとも以前の言語で最初に定義または実装されたもので、「公式の」科学用語ですか?

更新:

Frank Sheararは、SIMULA 67 Common Base Language(1970)の説明へのリンクを提供してくれました。この言語は、OOキーワードをclassobject、および正式な概念としての仮想として導入した最初の言語のようです。それはしません定義/純粋な非純粋または抽象的、しかしそれは概念をサポートしています

誰がそれらを定義しましたか?


1
これは面白いかもしれません... objectmentor.com/resources/articles/abcpvf.pdf
アーロンマク

2
仮想関数、仮想継承、仮想テーブル-それらを「仮想」にするものの実際の説明はありません。私は規則を知っていますが、なぜその言葉ですか?結局のところ、「仮想」関数は他の関数と同じくらいリアルです-遅延バインディングのルックアップが必要なだけです。たぶんStroustrupは本当にその言葉が好きだった。クラスは抽象的(純粋ではない)であると思いましたが、メソッドは純粋(抽象ではない)かもしれません。ただし、それを構成することは可能です。
Steve314

3
@ Steve314、それはStroustrupではありませんでした-明らかに、彼らはすでにSimulaでこのように呼ばれていました。
ペテルトレック

回答:


9

NygaardとDahlは、SIMULA 67 Common Base Languageで最初にこの用語を使用しました。たとえば、セクション2.1、およびセクション2.2.3を見てください。(少なくとも私が知る限り。しかし、ちょっと、OOPに関する限り、おそらくこの用語の最初の使用でしょう。)


3
Simulaは最初のOO言語であるAFAIKであるため、OOPコンテキストで多くの用語を初めて使用します。Stroustrupに大きな影響を与えました。Stroustrupは当初、C効率とSimulaクラスを備えた言語を望んでいました。
デビッドソーンリー

私はこの論文をざっと読んでいますが、「クラス」と「オブジェクト」を紹介しているので、はい、それが最初のようです。
スティーブンジュリス

2
そのため、SIMULA 67の定義を読むのに少し時間がかかりました。Simula 67は、1970年に「クラス」、「オブジェクト」、「非表示」、「値による呼び出し」、「参照による呼び出し」とともに「仮想」を作成しました。
スティーブンジュリス

5
「無駄」は、この分野の独創的な論文の1つを読むことを説明するのに使用する奇妙な言葉のようです。
フランクシェラー

7

だから...私は少し研究をしてきました。以下は、興味のある人のための小さな歴史の教訓です。:)答えだけに興味があるなら、一番下の結論にスキップしてください。

1967

SIMULA 67、最初のオブジェクト指向プログラミング言語は、キーワードをclassobjectreference by referencecall by valueおよびvirtualとして定義します

SIMULAの継承システムは、元々別の名前である連結(および接頭辞として知られています)で知られており、スーパータイプのコードがコピーされ、サブタイプのコードと「連結」されたという事実を指します。後に別の形態の継承システムが登場し、 delegation。ここでは、正しい型への参照によって呼び出しが委任されます。

仮想は、ほとんどの場合、適切な実装への呼び出しをディスパッチするために実行する必要があるプロセスを指します仮想メソッドテーブルます。固定/具体的な実装に比べて仮想的です。

1971年

Niklaus Wirthは、Stepwise Refinementと定義された概念について書いています。基本的に、拡張可能な部分的なソリューションにプログラムを分割する方法を説明します。

1974年

これは私が見つけた最初の論文で、Barbara Liskovによる抽象データ型という用語を作り出しています。

抽象データ型は、抽象オブジェクトのクラスを定義します。抽象オブジェクトのクラスは、それらのオブジェクトで利用可能な操作によって完全に特徴付けられます。つまり、抽象型は、その型の特性化操作を定義することで定義できます。プログラマーが抽象データオブジェクトを使用する場合、彼はそのオブジェクトが示す動作のみに関心があり、実装によってその動作がどのように達成されるかの詳細には関心がありません。

また、この論文は我々が現在インターフェースとして知っていることを指定するように見える操作クラスタを定義します

興味深い科学用語(1996年の論文):

継承:オブジェクトまたはクラスが動作またはデータを共有できる、より低レベルのメカニズム。

サブタイピング:概念的な特殊化を表します。インターフェイス継承とも呼ばれる特定の形式の継承

抽象化の原則:アプリケーションドメインの知識を抽象化の順序付けの階層的ランキングに編成するプロセス。関心のある現象のより良い理解を得るために。

部分的に実装された抽象化:定義が意図的に不完全なままになっている抽象化。

抽象クラス:オブジェクト指向システムで部分的に実装されたクラスの特定の用語。

非厳密な継承:操作をサブクラスで再定義(または削除)することができます。

厳密な継承:動作的に互換性のある継承。

結論

抽象クラスは、オブジェクト指向システムで使用する最も一般的な用語です。それはそうです、純粋かつ非純粋仮想関数はC ++に由来します。たとえば、Stroustrupとのこのインタビューでは、彼が用語を発明したように思われます。科学論文では、より一般的な用語を使用しています。

VirtualはSIMULAに由来するものであり、SIMULAの使用法が広まっていますが、一般的な用語ではありません。すでに実装の詳細を定義しています。継承種類の観点から言えば、より適切です。非仮想にデフォルト対応により、厳格な継承デフォルトでは、しばらくの仮想へのデフォルト対応により、厳格で継承

ウィキペディアのエントリの調整に興味がある人はいますか?:)


バーバラ・リスコフの前に、ダイクストラは「STEP-WISE PROGRAM COMPOSITION」で何か言いたいことがありましたが、これも関連するリソースかもしれません。
スティーブンジュリス

4

C ++では、動的にバインドされ、したがってサブクラスによってオーバーライドできるメンバー関数は「仮想」と呼ばれます。絶対にオーバーライドする必要がある仮想機能は、「純粋仮想」と呼ばれます。純粋な仮想関数にはボディがある場合がありますが、多くの場合はありません。少なくとも1つの純粋な仮想関数を持つクラスは「抽象」と呼ばれ、インスタンス化することはできず、派生するだけです。

仮想関数が仮想と呼ばれる理由は、コンパイル時にどの実際の関数が呼び出されるかわからないという事実だと思います。ある意味では、コンパイル時に仮想関数呼び出しは「存在しません」。

また、純粋な仮想関数を持つクラスに「抽象」という用語が使用されている理由は、そのクラスのオブジェクトを使用できないためだと推測しています。ある意味では、それはオブジェクトの具体的な世界から遠く離れた抽象的な概念です。

編集:他の言語。

「仮想」という用語がどの程度一般的であるかという疑問については、ここで2セントです。Smalltalkでは、すべての関数は動的バインディングを使用するため、すべて仮想であり、特別な用語や言語キーワードは必要ありません。Javaでは、私が間違っていなければ、コンパイラは動的バインディングを使用すべきかどうかを自動的に決定します。プログラマーに関する限り、区別はなく、したがって「仮想」キーワードはありません。

C ++では、動的バインディングを使用してオーバーヘッドが不要な場合にそれを節約するタイミングを決定するのはプログラマー次第であるため、仮想と非仮想の区別が必要です。


1
+1:また、「抽象」は多くの言語に適用されます。「仮想」にはありません。
S.Lott

@ S.Lott:質問全体は、仮想が一般的な用語であるかどうかです。私の知る限り、virtualは多くの言語に適用され、Simulaによって最初に作られました。純粋/非純粋および抽象についての質問が残っています。
スティーブンジュリス

@Steven Jeuris:「仮想は多くの言語に適用されますか?」本当に。これまでのところ、C、C ++、およびSimulaのようです。確かにPythonには少しでも適用されません。Javaには当てはまらないようです。
S.Lott

Object Pascal / Delphiに適用されます。Delphiには追加の概念がありますdynamic--これは、スペースを時間と交換する一種の仮想virtualメソッドです。メソッドよりもスペースが少なく、実行に時間がかかります。
フランク・シーラー

2
@Steven Jeuris:「デフォルトで仮想」は、「仮想」を使用して抽象関数を記述するのと同じではありません。「すべての関数は仮想」と言う人は、C ++の概念を別の言語に適用していると思います。そして、彼らはそれを不適切に行っていると思います。Pythonではすべてのメソッド関数が仮想であるため、C ++の概念をPythonに適用するStack Overflowのような場所を除いて、「仮想」を使用してこのトピックに言及することはありません。Python言語のドキュメントではこの単語を使用していないため、これらの場合、virtualは不適切に適用されていると思います。
-S.Lott
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.