|
|
Правила доступа ($$r.11) к виртуальной функции определяются ее описанием и на них не влияют правила доступа к к функции, которая позднее будет подавлять ее. Приведем пример:
class B { public: virtual f(); }; class D : public B { private: f(); }; void f() { D d; B* pb = &d; D* pd = &d; pb->f(); // нормально: B::f() общий член // вызывается D::f() pd->f(); // ошибка: D::f() частный член }
Права доступа проверяются при самом вызове, используя тип выражения, обозначающее объект, для которого вызывается функция-член (в примере выше это B*). Доступ к функции-члену в классе, где она определена (D в примере выше), в общем случае неизвестен.
| |