14 Member access control [class.access]

14.5 Access to virtual functions [class.access.virt]

Правила доступа (пункт [class.access]) для виртуальной функции определяются ее объявлением и не зависят от правил для функции, которая позже переопределяет ее. [Example:

class B {
public:
  virtual int f();
};

class D : public B {
private:
  int f();
};

void f() {
  D d;
  B* pb = &d;
  D* pd = &d;

  pb->f();                      // OK: B​::​f() is public, D​::​f() is invoked
  pd->f();                      // error: D​::​f() is private
}

end example]

Доступ проверяется в точке вызова с использованием типа выражения, используемого для обозначения объекта, для которого вызывается функция-член (B* в примере выше). Доступ к функции-члену в классе, в котором она была определена (D в приведенном выше примере), как правило, неизвестно.