Очевидный ответ: потому что так говорится в стандарте.Мотивом этого в стандарте является то, что static_cast
должно быть близко к тривиальному - самое большее, простое сложение или вычитание константы для указателя.Где переход на виртуальную базу потребует более сложного кода: возможно, даже с дополнительной записью в виртуальной таблице.(Это требует чего-то большего, чем константы, поскольку позиция D
относительно A
может измениться, если произойдет дальнейшая деривация.) Преобразование очевидно выполнимо, поскольку при вызове виртуальной функции на A*
функция реализована в D
, компилятор должен это делать, но дополнительные издержки считались неуместными для static_cast
.(Предположительно, единственной причиной для использования static_cast
в таких случаях является оптимизация, поскольку dynamic_cast
обычно является предпочтительным решением. Поэтому, когда static_cast
, скорее всего, будет стоить столько же, сколько dynamic_cast
, зачем его поддерживать?)1011 *