final
- отличное ключевое слово. Это позволяет мне предотвратить наследование от класса. Это также позволяет компилятору пропускать механизмы диспетчеризации во время выполнения при вызове виртуальных функций или обращении к виртуальным базам.
Предположим, теперь у меня есть некоторый не final
класс T
с виртуальными функциями и / или базовыми классами. Предположим также, что у меня есть ссылка на экземпляр этого класса. Как я могу сказать компилятору, что эта конкретная ссылка относится к полностью производному завершенному объекту, а не к базовому подобъекту более производного типа?
Мои мотивы - это такие классы, как optional
и vector
. Если я призываю optional<T>::operator*()
, я получаю T&
. Однако я с уверенностью знаю, что эта ссылка действительно T
, а не какой-то более производный объект. То же относится и к vector<T>
и ко всем способам доступа к его элементам.
Я думаю, что было бы хорошей оптимизацией пропустить динамическую диспетчеризацию c в таких случаях, особенно в режиме отладки и на недостаточно умных компиляторах для просмотра реализаций optional
и vector
и девиртуализации. звонки.