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

352
14 июня 2017, 02:45

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

Answer 1

Интересный вопрос.

Ведь статическая функция — это та, которая не принимает указатель (this) на конкретный экземпляр класса, а потому работает исключительно с тем, что принадлежит самому классу (то есть объявлено с ключевым словом static).

В то же время, виртуальная функция отличается от обычного метода исключительно своим присутствием в таблице виртуальных функций (vtable).

То есть технически ничто не мешает поместить статическую (да и вообще любую) функцию в vtbl — это же просто константный массив указателей на функции. Единственное, что изменится для компилятора — пропадание необходимости передавать первым аргументом указатель this некоторым виртуальным функциям.

Но тогда возникает идеологическое противоречие. С одной стороны, статическая функция принадлежит самому классу (неважно какому — базовому или наследнику), а потому не требует знания this. С другой, виртуальность привязана к конкретному экземпляру класса, а потому требует этот указатель. Получаем противоречие: для поиска класса this нужен, а для вызова нет. Какой-то полустатический метод получается.

Поэтому комитет постановил: подобные финты в языке не разрешать.

Answer 2

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

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

READ ALSO
Передача шаблонной функции в for_each

Передача шаблонной функции в for_each

Выдает ошибку при попытке передать в функцию for_each, третьим параметром, шаблон функцииПомогите разобраться

295
Добавить хеш git в исходный код

Добавить хеш git в исходный код

Как заставить Visual Studio автоматом при сборке присваивать макросу GIT_HASH значение хеша git, без использования дополнительных утилит/установки...

303