Sanal işlevlerine erişimi
Erişim denetimi için uygulanan sanal işlevler işlev çağrısı yapmak için kullanılan türü tarafından belirlenir.Erişim denetimi belirli bir türü için geçersiz kılma bildirimlerini işlevin etkilemez.Örne?in:
// 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;
}
Yukarıdaki örnekte, sanal işlevi çağırmadan GetState yazmak için bir işaretçi kullanarak VFuncBase çağrıları VFuncDerived::GetState, ve GetState genel olarak kabul edilir.Ancak, arama GetState yazmak için bir işaretçi kullanarak VFuncDerived Denetim erişim ihlali, çünkü GetState sınıfında özel olarak bildirilmiş VFuncDerived.
![]() |
---|
Sanal işlevi GetState temel sınıf işaretçisi kullanılarak çağrılabilir VFuncBase.Bu çağrılan işlev bu işlevi temel sınıf sürümü olduğu anlamına gelmez. |