Доступ к виртуальным функциям
Управление доступом, применяемое для виртуальных функций, определяется типом, используемым для вызова функции. Переопределение объявлений функции не влияет на управление доступом для данного типа. Например:
// 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.Это не означает, что вызываемая функция является версией базового класса данной функции.