The access rules (Clause [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:
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
}
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.