Вопрос

И почему мы не используем тот же метод для не виртуальных функций?

Я имею в виду, почему мы используем виртуальные функции таким образом? Разве мы не можем просто использовать их в качестве не виртал и переопределить их?

И если этот метод экономит нам время/пространство или вообще вообще, почему бы нам не использовать тот же метод для не виртуальных функций? Я имею в виду, что имело бы смысл, что будет одна таблица функций для определенного класса.

В любом случае, заранее спасибо, я немного смущен.

Это было полезно?

Решение

Вы не можете иметь полиморфизм времени выполнения без использования уровня косвенности. Вот для чего VPTR.

VPTR не используется для неполиморфных функций, потому что это косвенно чего-то стоит. Философия C ++ заключается в том, что вы не платите за то, что не используете.

РЕДАКТИРОВАТЬ:

Вот некоторая информация о том, как работают виртуальные таблицы: http://en.wikipedia.org/wiki/virtual_table

Другие советы

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

Использование VPTR позволяет разрешить метод на основе типа объекта, а не типа переменной. Не использование VPTR делает вызовы метода быстрее. Дизайнеры C ++ решили разрешить удобство виртуальных функций, но не требуют штрафа за производительность для других функций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top