Я работаю с C++ всего 2-3 месяца и недавно узнал об идентификаторе final, который идет после виртуальной функции. До сих пор я считал, что отсутствие virtual остановит распространение виртуальности, но я ошибался. Он неявно распространяется.
Мой вопрос заключается в следующем. Зачем разрешать неявное распространение? Почему наличие virtual не может сделать функцию виртуальной, а отсутствие virtual сделать функцию не виртуальной? Лучше в некоторых обстоятельствах? или это было в те дни, когда впервые был представлен виртуальный?
Согласно Clifford answer, есть даже компилятор, выдающий предупреждение при отсутствии virtual.
почему виртуальность методов неявно распространяется в c а>
Я ожидал, что ссылка выше ответит на мой вопрос, но это не так.
------------ Добавление -------------
Есть комментарии о полезности этой функции. Я думаю, что ключевое слово final в виртуальной функции — это то, что делает функцию девиртуализированной. Функция больше не может быть переопределена, поэтому производный класс должен повторно объявить функцию независимо от того, имеет ли она то же имя или нет. Если final отличается от девиртуализации, помогите мне понять это. Если final не отличается, то полезность девиртуализации очевидна из факта введения final. Я согласен с тем, что форсирование явного виртуального приведет к ошибкам, но мне любопытно, есть ли другие причины.
final
не для Java? Или это C++11 и я что-то пропустил? - person Jean-François Fabre   schedule 21.08.2016final
гораздо сильнее, чем остановить виртуальное распространение здесь.) - person molbdnilo   schedule 21.08.2016final
— это C++11, поэтому вы отстаете на несколько лет. (Это полезно.) - person molbdnilo   schedule 21.08.2016vehicle->go()
вызывалCar::go()
, но неToyota::go()
- person M.M   schedule 23.08.2016