Функции
public
и protected
всегда являются виртуальными, если только компилятор не решит, что он может оптимизировать их, чтобы они были не виртуальными (что может произойти, только если вы пометите их как final
, а они непереопределить что угодно).Некоторые конкретные вызовы виртуальных функций могут быть оптимизированы для не виртуальных, если компилятор может гарантировать точный тип объекта, но это вряд ли произойдет часто, учитывая, что относительно редко вы можете знать точный тип объекта (обычно толькосразу после создания с помощью new
), и dmd обычно избегает анализа потока.
private
и package
никогда не являются виртуальными.
Электронная документация делает подразумевается, что вы можете перегрузить package
, но это определенно не то, что делает компилятор, и я на 99,99% уверен, что текущее поведение является предполагаемым поведением и всегда будет поведением.Хотя я пытаюсь проверить это в группе новостей D.