Access to Virtual Functions
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.