Обсуждая вопрос о виртуальных функциях в Stack Overflow, я удивлялся, существует ли какое-либо официальное наименование для чистых (абстрактных) и не чистых виртуальных функций.
Я всегда полагался на Википедию для получения информации, которая гласит, что чистые и не чистые виртуальные функции являются общим термином. К сожалению, статья не подкрепляет это происхождением или ссылками.
Чтобы процитировать ответ Джона Скита на мой ответ, что чистый и не чистый являются общим термином:
@Steven: Хм ... возможно, но я когда-либо видел это только в контексте C ++. Я подозреваю, что любой, говорящий о них, вероятно, имеет C ++ опыт :)
Происходят ли термины из C ++, или они были впервые определены или реализованы на более раннем языке, и являются ли они «официальными» научными терминами?
ОБНОВИТЬ:
Фрэнк Шеарар любезно предоставил ссылку на описание общего базового языка SIMULA 67 (1970). Этот язык, кажется, является первым языком, который вводит ключевые слова ОО как класс , объект , а также виртуальный как формальное понятие. Он не определяет чистый / не чистый или абстрактный , но поддерживает понятия .
Кто их определил?
источник
Ответы:
Nygaard и Dahl впервые использовали этот термин в SIMULA 67 Common Base Language . Посмотрите, например, в разделе 2.1 и разделе 2.2.3. (Насколько я могу судить, по крайней мере. Но, что касается ООП, это, вероятно, первое использование этого термина.)
источник
Итак ... Я провел небольшое исследование. Далее следует небольшой урок истории для интересующихся. :) Перейдите к заключению внизу, если вас интересует только ответ.
1967 г . :
SIMULA 67 , первый объектно-ориентированный язык программирования, определяет ключевые слова как класс , объект , вызов по ссылке , вызов по значению и виртуальный .
Система наследования SIMULA была первоначально известна под другим именем - конкатенация (и позже известная как префикс ), ссылаясь на тот факт, что код супертипов был скопирован и «конкатенирован» с кодом подтипов. Позже появилась другая форма системы наследования - делегирование , где вызовы делегируются по ссылке на правильный тип.
Виртуальный, скорее всего, относится к процессу, который необходимо выполнить для отправки вызова правильной реализации с использованием таблицы виртуальных методов . Это виртуально по сравнению с фиксированной / конкретной реализацией.
1971 :
Никлаус Вирт пишет о понятии, определенном как поэтапное уточнение . Это в основном объясняет, как разделить программу на частичные решения, которые могут быть расширены.
1974 :
Это самая ранняя статья, которую я нашел, в которой есть термин « абстрактные типы данных » Барбары Лисков .
Эта статья также определяет кластер операций, который, кажется, определяет то, что мы теперь знаем как интерфейс .
Интересная научная терминология (статья 1996 г.):
Наследование : более низкоуровневый механизм, с помощью которого объекты или классы могут совместно использовать поведение или данные.
Подтип : выражает концептуальную специализацию. Особая форма наследования, также называемая интерфейсным наследованием .
Принципы абстракции : процесс организации наших знаний в области приложения в иерархическом порядке упорядочения абстракций, чтобы получить лучшее понимание рассматриваемых явлений.
Частично реализованные абстракции : абстракции, определения которых намеренно оставлены неполными.
Абстрактные классы : Специальный термин для частично реализованного класса в объектно-ориентированных системах.
Неограниченное наследование : позволяет переопределять (или даже удалять) операции в подклассах.
Строгое наследование : наследственно- поведенческое наследование.
Вывод :
Абстрактный класс является наиболее общим термином для использования в объектно-ориентированных системах. Кажется, что чистые и не чистые виртуальные функции происходят только из C ++. Например, это интервью со Страуструпом дает понять, что он изобрел термины. В научных работах используется более общая терминология.
Виртуальный происходит от SIMULA, что делает его использование широко распространенным, но это не общий термин. Это уже определяет детали реализации. Говоря с точки зрения типов наследования является более подходящим. Не виртуальный по умолчанию соответствует строгому наследованию по умолчанию, а виртуальный по умолчанию соответствует нестрогому наследованию .
Кто-нибудь заинтересован в корректировке записи в Википедии ? :)
источник
В C ++ функции-члены, которые динамически связаны и, таким образом, могут быть переопределены подклассом, называются «виртуальными». Виртуальные функции, которые обязательно должны быть переопределены, называются «чисто виртуальными». Обратите внимание, что чисто виртуальная функция может иметь тело, хотя часто это не так. Класс, который имеет по крайней мере одну чисто виртуальную функцию, называется «абстрактным» и не может быть создан, а только получен из.
Я предполагаю, что причина, по которой виртуальные функции называются виртуальными, заключается в том, что неизвестно, какая именно функция будет вызываться во время компиляции. В некотором смысле, вызов виртуальной функции «не существует» во время компиляции.
Я также предполагаю, что причина, по которой термин «абстрактный» используется для класса с чисто виртуальной функцией, заключается в том, что вы не можете иметь никаких объектов этого класса. В каком-то смысле это абстрактная концепция, далекая от конкретного мира объектов.
Редактировать: Другие языки.
Что касается вопроса о том, насколько общий термин «виртуальный», вот мои два цента. В Smalltalk все функции используют динамическое связывание, поэтому все они являются виртуальными, и нет необходимости в специальном термине или ключевом слове языка. В Java, если я не ошибаюсь, компилятор автоматически решает, следует ли использовать динамическое связывание, поэтому для программиста нет различий и, следовательно, нет «виртуального» ключевого слова.
В C ++ различие между виртуальным и не виртуальным необходимо, потому что программист должен решить, когда следует использовать динамическое связывание, чтобы сэкономить на издержках, когда это не нужно.
источник
dynamic
это своего рода виртуальный метод, который торгует пространством во времени: они занимают меньше места и выполняются медленнее, чемvirtual
методы.