"У других языков (C ++ или C #) есть другие правила?"
Что ж, в C ++ есть другие правила: статический или динамический процесс привязки функции-члена и принудительное выполнение прав доступа являются ортогональными.
Предоставление функции-члену модификатора привилегий доступа private
означает, что эта функция может вызываться только ее декларирующим классом, но не другими (даже не производными классами). Когда вы объявляете функцию-член private
как virtual
, даже чисто виртуальную (virtual void foo() = 0;
), вы позволяете базовому классу получать выгоду от специализации, в то же время применяя права доступа.
Когда дело доходит до virtual
функций-членов, права доступа говорят вам, что вы должны делать:
private virtual
означает, что вам разрешено специализировать поведение, но вызов функции-члена выполняется базовым классом, безусловно, контролируемым образом
protected virtual
означает, что вы должны / должны вызвать версию функции-члена верхнего класса при переопределении
Итак, в C ++ привилегии доступа и виртуальность не зависят друг от друга. Определение того, должна ли функция быть статически или динамически связанной, является последним шагом в разрешении вызова функции.
Наконец, шаблон проектирования «Шаблонный метод» следует отдавать предпочтение перед public virtual
функциями-членами.
Ссылка: Беседы: виртуально ваши
В статье дается практическое применение функции-члена private virtual
.
ИСО / МЭК 14882-2003 §3.4.1
Поиск имени может связывать более одного объявления с именем, если он находит имя как имя функции; говорят, что объявления образуют набор перегруженных функций (13.1). Разрешение перегрузки (13.3) происходит после успешного поиска имени. Правила доступа (пункт 11) рассматриваются только после успешного поиска имени и разрешения перегрузки функции (если применимо). Только после поиска имени, разрешения перегрузки функции (если применимо) и проверки доступа успешно выполняются атрибуты, введенные объявлением имени, которые используются в дальнейшем при обработке выражений (пункт 5).
ИСО / МЭК 14882-2003 §5.2.2
Функция, вызываемая в вызове функции-члена, обычно выбирается в соответствии со статическим типом выражения объекта (пункт 10), но если эта функция isvirtual и не указана с помощью aqualified-id, тогда фактически вызванная функция будет последней переопределенной функцией ( 10.3) выбранной функции в динамическом типе выражения объекта [Примечание: динамический тип - это тип объекта, на который указывает или на который ссылается текущее значение выражения объекта.