The access control applied to virtual functions is determined by the type used to make the function call. Overriding declarations of the function do not affect the access control for a given type. For example:
class VFuncBase
{
public:
virtual int GetState() { return _state; }
protected:
int _state;
};
class VFuncDerived : public VFuncBase
{
private:
int GetState() { return _state; }
};
...
VFuncDerived vfd; // Object of derived type.
VFuncBase *pvfb = &vfd; // Pointer to base type.
VFuncDerived *pvfd = &vfd; // Pointer to derived type.
int State;
State = pvfb->GetState(); // GetState is public.
State = pvfd->GetState(); // GetState is private; error.
In the preceding example, calling the virtual function GetState
using a pointer to type VFuncBase
calls VFuncDerived::GetState
, and GetState
is treated as public. However, calling GetState
using a pointer to type VFuncDerived
is an access-control violation because GetState
is declared private in class VFuncDerived
.
! WARNING The virtual function GetState
can be called using a pointer to the base class VFuncBase
. This does not mean that the function called is the base-class version of that function.