Почему чисто виртуальная функция инициализируется 0?

Я думаю, что этот метод довольно опрятен, он избегает повторения или добавления чего-либо к классам. Что еще вы ищете?

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

144
задан Peter Mortensen 20 April 2017 в 20:51
поделиться

11 ответов

Причина использования =0 заключается в том, что Бьярне Штроуструп не думал, что сможет получить другое ключевое слово, например, "чистое" мимо сообщества C++ в то время, когда эта функция была реализована. Это описано в его книге The Design & Evolution of C++, раздел 13.2.3:

Был выбран любопытный синтаксис =0... потому что в то время я не видел никаких шансов и принять новое ключевое слово.

Он также явно заявляет, что для этого не нужно устанавливать запись vtable в NULL, и что это не лучший способ реализации чисто виртуальных функций.

160
ответ дан 23 November 2019 в 22:47
поделиться

Раздел 9.2 стандарта C ++ дает синтаксис для классов. Он включает в себя эту продукцию:

pure-specifier:
    = 0

Нет ничего особенного в отношении стоимости. «= 0» - это просто синтаксис для того, чтобы сказать «Эта функция чисто виртуальна». Он не имеет ничего общего с инициализацией или нулевыми указателями или нулем числового значения, хотя сходство с тем, что может иметь MneMonic.

29
ответ дан 23 November 2019 в 22:47
поделиться

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

Синтаксис = 0 = 0 = 0 синтаксис, который действительно был выбран, поскольку оно напоминает настроек ввода VTable на 0 , но это чисто символическое. (Большинство компиляторов назначают такие элементы введенных в заглушки, которые испускают ошибку перед прерыванием программы.) Синтаксис был в основном выбран, потому что он не использовался ни для чего, и он сохранил введение нового ключевого слова.

15
ответ дан 23 November 2019 в 22:47
поделиться

Я не уверен, есть ли смысл в этом. Это просто синтаксис языка.

-121--1826542-

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

-121--1826547-

C++ должен иметь способ отличить чистую виртуальную функцию от объявления нормальной виртуальной функции. Они выбрали синтаксис = 0 . Они могли просто легко сделать то же самое, добавив чистое ключевое слово. Но C++ довольно не хочет добавлять новые ключевые слова и предпочитает использовать другие механизмы для введения функций.

11
ответ дан 23 November 2019 в 22:47
поделиться

Я помню, как читал, что оправдание для забавного синтаксиса было то, что было проще (с точки зрения принятия стандартов), чем введение другого ключевого слова, которое будет делать то же самое.

Я считаю, что это упомянуло в дизайне и эволюции C ++ Bjarne Strourstrup.

3
ответ дан 23 November 2019 в 22:47
поделиться

= 0 объявит чистую виртуальную функцию .

Что такое понимание, состоит в том, что это необходимо инициализировать ввод VTable для этой функции для NULL, а любое другое значение здесь приводит к ошибке с компиляцией

Я не думаю, что это правда. Это просто специальный синтаксис. VTable определяется реализацией. Никто не говорит, что ввод VTable для чистого элемента должен быть фактически обнулен при строительстве (хотя большинство компиляторов обрабатывают VTTable, похожие).

2
ответ дан 23 November 2019 в 22:47
поделиться

Я не уверен, есть ли смысл в этом. Это просто синтаксис языка.

-121--1826542-

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

-121--1826547-

В этом случае ничего не инициализируется или не присваивается нулю. = 0 только в синтаксической конструкции, состоящей из = и 0 токенов, которая абсолютно не имеет отношения ни к инициализации, ни к назначению.

Он не имеет отношения ни к какому фактическому значению в «vtable». Язык C++ не имеет понятия «vtable» или чего-либо подобного. Различные «vtables» являются не более чем подробностями конкретных реализаций.

7
ответ дан 23 November 2019 в 22:47
поделиться

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

2
ответ дан 23 November 2019 в 22:47
поделиться

Ну, вы также можете инициализировать запись переменной в точку фактической функции"

 virtual void fun()
 {
     //dostuff()
 }

Похоже на интуицию, что запись переменной может быть определена либо в точку ниоткуда (0), либо в функцию. Если вы укажете для нее свое собственное значение, то она, скорее всего, будет указывать на мусор, а не на функцию. Но именно поэтому "= 0" разрешено, а "= 1" - нет. Подозреваю, что Нил Баттеруорт прав насчет того, почему вообще используется "= 0"

.
1
ответ дан 23 November 2019 в 22:47
поделиться

Моя проблема с этими ответами, защищающими утверждение, заключается в том, что никто четко не указывает, что делает его отличным от обычной фатальной ошибки , и почему утверждение не может быть подмножеством исключения . Теперь, когда сказано, что если исключение никогда не поймают? Это делает это утверждением по номенклатуре? И почему вы когда-нибудь хотите наложить ограничение на язык, на котором может быть выдвинуто исключение, с которым/ничего/может справиться?

-121--617583-

Идея функциональных зависимостей заключается в том, что в объявлении

class Collapse a r | r -> a where
  ...

бит r - > говорит, что a однозначно определяется r . Таким образом, нельзя иметь экземпляр Collapse (a - > r) (a - > r) и экземпляр Collapse a (a - > r) . Обратите внимание, что экземпляр Collapse (a - > r) (a - > r) следует из экземпляр Collapse a для полной картины.

Другими словами, код пытается установить экземпляр Collapse t t (имя переменной типа, конечно, не имеет значения) и экземпляр Collapse a (a - > r) . При замене (a - > r) на t в объявлении первого экземпляра получается экземпляр Свертывание (a - > r) (a - > r) . Теперь это единственный экземпляр Collapse с параметром второго типа, равным (a - > r) , который может иметь , поскольку в объявлении класса указано, что параметр первого типа должен быть вычитаемым из второго. Затем необходимо установить экземпляр a (a - > r) , который добавит другой экземпляр Collapse с параметром второго типа (a - > r) . Таким образом, жалуется GHC.

-121--2409072-

Я не уверен, есть ли какое-либо значение за этим. Это просто синтаксис языка.

19
ответ дан 23 November 2019 в 22:47
поделиться

Как и в случае с большинством «почему» вопросы о дизайне C ++, первое место для просмотра дизайн и эволюция C ++ , Bjarne Stroustrup 1 :

Любопытно = 0 Синтаксис был выбран над очевидной альтернативой Представляем новое ключевое слово Pure или Аннотация , потому что в то время я видел Нет шансов получить новое ключевое слово принял. Если бы я предложил чисто , Выпуск 2.0 будет отправлен без Абстрактные классы. Учитывая выбор между приятным синтаксисом и абстрактным Классы, я выбрал абстрактные классы. А не рисковая задержка и нести определенные бои в течение Чисто , я использовал традиции C и C ++ Конвенция использования 0 для представления "не там." = 0 синтаксис подходит с мой взгляд, что тело функции Инициализатор для функции также с (упрощенный, но обычно адекватный) Взгляд набора виртуальных функций быть реализованным как вектор Функциональные указатели. [...]

1 §13.2.3 Синтаксис

76
ответ дан 23 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: