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