Acesso a funções virtuais
O controle de acesso aplicado às funções virtuais é determinado pelo tipo usado para fazer a chamada de função. Substituir declarações da função não afeta o controle de acesso para um determinado tipo. Por exemplo:
// 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;
}
No exemplo anterior, chamar a função virtual GetState usando um ponteiro para o tipo VFuncBase chama VFuncDerived::GetState, e GetState é tratada como pública. No entanto, chamar GetState usando um ponteiro para o tipo VFuncDerived é uma violação de controle de acesso porque GetState é declarado como particular na classe VFuncDerived.
Aviso
A função virtual GetState pode ser chamada usando um ponteiro para a classe base VFuncBase.Isso não significa que a função chamada seja a versão da classe base dessa função.