Некоторые методы оптимизации виртуального наследования:
- Применение идиомы невиртуального интерфейса (NVI). grep.cs.msu.ru Её смысл в том, чтобы обернуть открытыми невиртуальными функциями-членами вызовы менее доступных виртуальных функций. grep.cs.msu.ru
- Замена виртуальных функций членами данных — указателями на функции. grep.cs.msu.ru Это упрощённое проявление паттерна проектирования «Стратегия». grep.cs.msu.ru
- Замена виртуальных функций членами данных — tr1::function. grep.cs.msu.ru Это позволяет применять любую вызываемую сущность, сигнатура которой совместима с нужной. grep.cs.msu.ru
- Замена виртуальных функций из одной иерархии виртуальными функциями из другой иерархии. grep.cs.msu.ru Это традиционная реализация паттерна проектирования «Стратегия». grep.cs.msu.ru
- Инициализация всех подобъектов виртуальных базовых классов самим производным классом. habr.com Например, компилятор может передавать специальный дополнительный аргумент в конструкторы, который будет указывать не инициализировать класс базового класса. habr.com
- Реализация функций, которые не будут копировать члены класса базового. habr.com Это поможет избежать двойного копирования объекта базового класса. habr.com
Также для оптимизации виртуального наследования рекомендуется не использовать без большой необходимости виртуальные функции, виртуальные базовые классы, деструкторы и другие механизмы. intuit.ru