Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Виртуальная статическая функция

#cpp #ооп


Почему статическая функция не может быть виртуальной?
    


Ответы

Ответ 1



Интересный вопрос. Ведь статическая функция — это та, которая не принимает указатель (this) на конкретный экземпляр класса, а потому работает исключительно с тем, что принадлежит самому классу (то есть объявлено с ключевым словом static). В то же время, виртуальная функция отличается от обычного метода исключительно своим присутствием в таблице виртуальных функций (vtable). То есть технически ничто не мешает поместить статическую (да и вообще любую) функцию в vtbl — это же просто константный массив указателей на функции. Единственное, что изменится для компилятора — пропадание необходимости передавать первым аргументом указатель this некоторым виртуальным функциям. Но тогда возникает идеологическое противоречие. С одной стороны, статическая функция принадлежит самому классу (неважно какому — базовому или наследнику), а потому не требует знания this. С другой, виртуальность привязана к конкретному экземпляру класса, а потому требует этот указатель. Получаем противоречие: для поиска класса this нужен, а для вызова нет. Какой-то полустатический метод получается. Поэтому комитет постановил: подобные финты в языке не разрешать.

Ответ 2



Специфика и сущность виртуального метода заключается в том, то выбор конкретной версии виртуального метода делается в момент вызова на основе анализа динамического типа объекта, использованного в этом вызове, в левой части операторов ->, ., ->* или .*. Статические методы - это фактически обычные функции, которые вызываются без участия каких-либо объектов. Поэтому и анализ динамического типа там применять не к чему.

Комментариев нет:

Отправить комментарий