Accès aux fonctions virtuelles
Le contrôle d'accès appliqué aux fonctions virtuelles est déterminé par le type utilisé pour effectuer l'appel de fonction. La substitution des déclarations de fonction n'affectent pas le contrôle d'accès pour un type donné. Par exemple :
// access_to_virtual_functions.cpp
class VFuncBase
{
public:
virtual int GetState() { return _state; }
protected:
int _state;
};
class VFuncDerived : public VFuncBase
{
private:
int GetState() { return _state; }
};
int main()
{
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(); // C2248 error expected; GetState is private;
}
Dans l'exemple précédent, l'appel de la fonction virtuelle GetState à l'aide d'un pointeur vers le type VFuncBase appelle VFuncDerived::GetState et GetState est traité comme public. Toutefois, l'appel de GetState à l'aide d'un pointeur vers le type VFuncDerived est une violation de contrôle d'accès car GetState est déclaré privé dans la classe VFuncDerived.
Avertissement
La fonction virtuelle GetState peut être appelée en utilisant un pointeur vers la classe de base VFuncBase.Cela ne signifie pas que la fonction appelée est la version de classe de base de cette fonction.