Мы всегда объявляем чисто виртуальную функцию как:
virtual void fun () = 0 ;
Т.е. оно всегда присваивается 0.
Что я понимаю, так это то, что это инициализирует запись vtable для этой функции в NULL, и любое другое значение здесь приводит к ошибке времени компиляции. Это понимание правильно или нет?
c++
abstract-class
pure-virtual
mukeshkumar
источник
источник
virtual void func() = 100;
Ответы:
Причина
=0
в том, что Бьярн Страуструп не думал, что сможет получить другое ключевое слово, такое как «чистое» прошлое сообщества C ++ во время реализации этой функции. Это описано в его книге «Дизайн и развитие C ++» , раздел 13.2.3:Он также прямо заявляет, что для этого необязательно устанавливать для записи vtable значение NULL и что это не лучший способ реализации чисто виртуальных функций.
источник
Как и в случае с большинством вопросов «Почему» о дизайне C ++, первое, на что стоит обратить внимание - «Дизайн и эволюция C ++ » Бьярна Страуструпа 1 :
1 §13.2.3 Синтаксис
источник
Раздел 9.2 стандарта C ++ дает синтаксис для членов класса. Включает в себя эту продукцию:
В ценности нет ничего особенного. «= 0» - это всего лишь синтаксис для выражения «эта функция чисто виртуальная». Это не имеет ничего общего с инициализацией, нулевыми указателями или нулевым числовым значением, хотя сходство с этими вещами может иметь мнемоническое значение.
источник
= 0
Что еще вы хотели бы знать? Это было бы то же самое, что спрашивать, почему тело функции заключено в {}. Ответ будет, потому что это то, что определяет синтаксис C ++.Я не уверен, есть ли за этим смысл. Это всего лишь синтаксис языка.
источник
C ++ всегда избегал введения новых ключевых слов, поскольку новые зарезервированные слова ломают старые программы, которые используют эти слова для идентификаторов. Часто одной из сильных сторон языка считается то, что он максимально уважает старый код.
= 0
Синтаксис , возможно , действительно был выбран , так как она напоминает установку записи в таблице виртуальной0
, но это чисто символический характер . (Большинство компиляторов присваивают такие записи vtable заглушке, которая выдает ошибку перед прерыванием программы.) Синтаксис был выбран в основном потому, что он раньше ни для чего не использовался, и он сохранил введение нового ключевого слова.источник
pure
ключевое слово было бы замечательно в моей книге. Во всяком случае, это хорошо, чтобы понять обоснование.#define pure = 0
.В C ++ должен быть способ отличить чисто виртуальную функцию от объявления нормальной виртуальной функции. Они решили использовать
= 0
синтаксис. Они могли бы просто сделать то же самое, добавив чистое ключевое слово. Но C ++ довольно не хочет добавлять новые ключевые слова и предпочитает использовать другие механизмы для введения функций.источник
Ничто не является "инициализированным" или "назначенным" нулем в этом случае.
= 0
просто синтаксическая конструкция, состоящая из токенов=
и0
токенов, которая не имеет абсолютно никакого отношения ни к инициализации, ни к присваиванию.Это не имеет никакого отношения к какому-либо фактическому значению в «vtable». В языке C ++ нет понятия «vtable» или чего-либо подобного. Различные «vtables» - это не более чем детали конкретных реализаций.
источник
Я помню, как читал, что оправдание смешного синтаксиса было в том, что это было проще (с точки зрения принятия стандартов), чем вводить другое ключевое слово, которое делало бы то же самое.
Я полагаю, что это было упомянуто в Проекте и Развитии C ++ Бьярном Страуструпом.
источник
Я бы предположил, что это только часть грамматики C ++. Я не думаю, что есть какие-то ограничения на то, как компиляторы фактически реализуют это для данного конкретного двоичного формата. Вы предположили, что, вероятно, были правы для ранних компиляторов C ++.
источник
= 0
Объявляет чистую виртуальную функцию .Я не думаю, что это правда. Это просто особый синтаксис. Vtable определяется реализацией. Никто не говорит, что запись vtable для чистого члена должна фактически обнуляться при построении (хотя большинство компиляторов обрабатывают vtables аналогично).
источник
= 0
делает, - это делает весь класс абстрактным и запрещает виртуальные вызовы чистых функций. Невиртуальные вызовы все еще в порядке, и именно тогда используется определение (если вы его предоставили).__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… вместо Base :: f ()Ну, вы также можете инициализировать запись vtable, чтобы она указывала на реальную функцию "
Кажется интуитивно понятным, что запись vtable может быть определена как нигде (0) или как функция. Если вы укажете свое собственное значение, оно, вероятно, приведет к тому, что оно будет указывать на мусор, а не на функцию. Но именно поэтому «= 0» разрешено, а «= 1» - нет. Я подозреваю, что Нил Баттерворт прав, почему "= 0" вообще используется
источник