The access rules ([class.access]) for a virtual function are determined by its declaration
and are not affected by the rules for a function that later overrides it.
class B {public:virtualint 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}
Access is checked at the call point using the type of the expression used
to denote the object for which the member function is called
(B*
in the example above).
The access of the member function in the class in which it was defined
(D
in the example above) is in general not known.