Страницы

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

понедельник, 24 декабря 2018 г.

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

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


Ответ

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

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

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