Правила доступа (пункт [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 ]