Чистый виртуальный или абстрактный, что в имени?

15

Обсуждая вопрос о виртуальных функциях в Stack Overflow, я удивлялся, существует ли какое-либо официальное наименование для чистых (абстрактных) и не чистых виртуальных функций.

Я всегда полагался на Википедию для получения информации, которая гласит, что чистые и не чистые виртуальные функции являются общим термином. К сожалению, статья не подкрепляет это происхождением или ссылками.

Чтобы процитировать ответ Джона Скита на мой ответ, что чистый и не чистый являются общим термином:

@Steven: Хм ... возможно, но я когда-либо видел это только в контексте C ++. Я подозреваю, что любой, говорящий о них, вероятно, имеет C ++ опыт :)

Происходят ли термины из C ++, или они были впервые определены или реализованы на более раннем языке, и являются ли они «официальными» научными терминами?

ОБНОВИТЬ:

Фрэнк Шеарар любезно предоставил ссылку на описание общего базового языка SIMULA 67 (1970). Этот язык, кажется, является первым языком, который вводит ключевые слова ОО как класс , объект , а также виртуальный как формальное понятие. Он не определяет чистый / не чистый или абстрактный , но поддерживает понятия .

Кто их определил?

Стивен Джеурис
источник
1
Возможно,
Аарон Макивер,
2
виртуальные функции, виртуальное наследование, виртуальные таблицы - ни одно из них не дает реального объяснения того, что делает их «виртуальными». Я знаю правила, но почему это слово? В конце концов, «виртуальная» функция так же реальна, как и любая другая функция - ей просто нужен поиск с поздним связыванием, вот и все. Может, Страуструпу просто очень понравилось это слово. Я думал, что классы были абстрактными (не чистыми), тогда как методы могли быть чистыми (но не абстрактными). Возможно, я это выдумал.
Steve314
3
@ Steve314, это был не Страуструп - видимо, их так называли уже в Симуле .
Петер Тёрёк

Ответы:

9

Nygaard и Dahl впервые использовали этот термин в SIMULA 67 Common Base Language . Посмотрите, например, в разделе 2.1 и разделе 2.2.3. (Насколько я могу судить, по крайней мере. Но, что касается ООП, это, вероятно, первое использование этого термина.)

Фрэнк Шиарар
источник
3
Simula был первым ОО-языком, AFAIK, поэтому он впервые использовал множество терминов в контексте ООП. Это сильно повлияло на Страуструпа, который изначально просто хотел язык с эффективностью Си и классами Simula.
Дэвид Торнли
Я пролистываю эту статью, и да, она кажется первой, поскольку они вводят «классы» и «объекты».
Стивен Джеурис
2
Итак, спустя некоторое время, потраченное на чтение определения SIMULA 67. Simula 67 в 1970 году придумал «виртуальный» вместе с «классом», «объектом», «скрытым», «вызовом по значению», «вызовом по ссылке». Никаких признаков «чистого», «нечистого» или «абстрактного».
Стивен Джеурис
5
«Потраченный впустую» кажется странным словом для описания чтения одной из основополагающих статей в этой области.
Фрэнк Шиарар
7

Итак ... Я провел небольшое исследование. Далее следует небольшой урок истории для интересующихся. :) Перейдите к заключению внизу, если вас интересует только ответ.

1967 г . :

SIMULA 67 , первый объектно-ориентированный язык программирования, определяет ключевые слова как класс , объект , вызов по ссылке , вызов по значению и виртуальный .

Система наследования SIMULA была первоначально известна под другим именем - конкатенация (и позже известная как префикс ), ссылаясь на тот факт, что код супертипов был скопирован и «конкатенирован» с кодом подтипов. Позже появилась другая форма системы наследования - делегирование , где вызовы делегируются по ссылке на правильный тип.

Виртуальный, скорее всего, относится к процессу, который необходимо выполнить для отправки вызова правильной реализации с использованием таблицы виртуальных методов . Это виртуально по сравнению с фиксированной / конкретной реализацией.

1971 :

Никлаус Вирт пишет о понятии, определенном как поэтапное уточнение . Это в основном объясняет, как разделить программу на частичные решения, которые могут быть расширены.

1974 :

Это самая ранняя статья, которую я нашел, в которой есть термин « абстрактные типы данных » Барбары Лисков .

Абстрактный тип данных определяет класс абстрактных объектов, который полностью характеризуется операциями, доступными над этими объектами. Это означает, что абстрактный тип может быть определен путем определения характеризующих операций для этого типа. Когда программист использует абстрактный объект данных, он имеет дело только с поведением, которое демонстрирует этот объект, но не с какими-либо подробностями того, как это поведение достигается посредством реализации.

Эта статья также определяет кластер операций, который, кажется, определяет то, что мы теперь знаем как интерфейс .

Интересная научная терминология (статья 1996 г.):

Наследование : более низкоуровневый механизм, с помощью которого объекты или классы могут совместно использовать поведение или данные.

Подтип : выражает концептуальную специализацию. Особая форма наследования, также называемая интерфейсным наследованием .

Принципы абстракции : процесс организации наших знаний в области приложения в иерархическом порядке упорядочения абстракций, чтобы получить лучшее понимание рассматриваемых явлений.

Частично реализованные абстракции : абстракции, определения которых намеренно оставлены неполными.

Абстрактные классы : Специальный термин для частично реализованного класса в объектно-ориентированных системах.

Неограниченное наследование : позволяет переопределять (или даже удалять) операции в подклассах.

Строгое наследование : наследственно- поведенческое наследование.

Вывод :

Абстрактный класс является наиболее общим термином для использования в объектно-ориентированных системах. Кажется, что чистые и не чистые виртуальные функции происходят только из C ++. Например, это интервью со Страуструпом дает понять, что он изобрел термины. В научных работах используется более общая терминология.

Виртуальный происходит от SIMULA, что делает его использование широко распространенным, но это не общий термин. Это уже определяет детали реализации. Говоря с точки зрения типов наследования является более подходящим. Не виртуальный по умолчанию соответствует строгому наследованию по умолчанию, а виртуальный по умолчанию соответствует нестрогому наследованию .

Кто-нибудь заинтересован в корректировке записи в Википедии ? :)

Стивен Джеурис
источник
До Барбары Лисков у Дейкстры также было что сказать по поводу «ШАГОВОГО СОСТАВА ПРОГРАММ» , что также может быть важным ресурсом.
Стивен Джеурис
4

В C ++ функции-члены, которые динамически связаны и, таким образом, могут быть переопределены подклассом, называются «виртуальными». Виртуальные функции, которые обязательно должны быть переопределены, называются «чисто виртуальными». Обратите внимание, что чисто виртуальная функция может иметь тело, хотя часто это не так. Класс, который имеет по крайней мере одну чисто виртуальную функцию, называется «абстрактным» и не может быть создан, а только получен из.

Я предполагаю, что причина, по которой виртуальные функции называются виртуальными, заключается в том, что неизвестно, какая именно функция будет вызываться во время компиляции. В некотором смысле, вызов виртуальной функции «не существует» во время компиляции.

Я также предполагаю, что причина, по которой термин «абстрактный» используется для класса с чисто виртуальной функцией, заключается в том, что вы не можете иметь никаких объектов этого класса. В каком-то смысле это абстрактная концепция, далекая от конкретного мира объектов.

Редактировать: Другие языки.

Что касается вопроса о том, насколько общий термин «виртуальный», вот мои два цента. В Smalltalk все функции используют динамическое связывание, поэтому все они являются виртуальными, и нет необходимости в специальном термине или ключевом слове языка. В Java, если я не ошибаюсь, компилятор автоматически решает, следует ли использовать динамическое связывание, поэтому для программиста нет различий и, следовательно, нет «виртуального» ключевого слова.

В C ++ различие между виртуальным и не виртуальным необходимо, потому что программист должен решить, когда следует использовать динамическое связывание, чтобы сэкономить на издержках, когда это не нужно.

Дима
источник
1
+1: также «Аннотация» относится ко многим языкам. «Виртуальный» нет.
S.Lott
@ S.Lott: весь вопрос в том, является ли виртуальный общий термин. Насколько я могу судить сейчас, виртуальное действительно применимо ко многим языкам, и было впервые придумано Симулой. Остается вопрос о чистых / не чистых и абстрактных.
Стивен Джеурис
@ Стивен Джеурис: «Виртуально это относится ко многим языкам»? В самом деле. Пока что, похоже, это C, C ++ и Simula. Это, конечно, не относится к Python даже немного. Кажется, это не относится к Java.
S.Lott
Это относится к объекту Pascal / Delphi. У Delphi есть дополнительная концепция - dynamicэто своего рода виртуальный метод, который торгует пространством во времени: они занимают меньше места и выполняются медленнее, чем virtualметоды.
Фрэнк Шиарар
2
@ Steven Jeuris: «виртуальный по умолчанию» - это не то же самое, что использование «виртуального» для описания абстрактных функций. Я думаю, что люди, которые говорят, что «все функции являются виртуальными», применяют концепцию C ++ к другому языку. И я думаю, что они делают это неправильно. Поскольку все функции метода являются виртуальными в Python, тема никогда не упоминается с использованием «virtual», за исключением таких мест, как переполнение стека для применения концепции C ++ к Python. Я думаю, что виртуальный применяется неправильно в этих случаях, так как документы языка Python не используют это слово.
S.Lott