Поделиться через


Доступ к виртуальным функциям

Управление доступом, применяемое для виртуальных функций, определяется типом, используемым для вызова функции. Переопределение объявлений функции не влияет на управление доступом для данного типа. Например:

// 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;
}

В приведенном выше примере вызов виртуальной функции GetState с помощью указателя на тип VFuncBase приводит к вызову функции VFuncDerived::GetState, и функция GetState обрабатывается как открытая. Однако вызов GetState с помощью указателя на тип VFuncDerived нарушает правила управления доступом, поскольку функция GetState в классе VFuncDerived объявляется закрытой.

Предупреждение

Виртуальную функцию GetState можно вызвать с помощью указателя на базовый класс VFuncBase.Это не означает, что вызываемая функция является версией базового класса данной функции.

См. также

Ссылки

Управление доступом к членам