Sadece geçmişte kullandığım bir örnek. Korumalı yöntemler, uygulamaya özgü işlevler sağlamak için mükemmeldir, aynı zamanda temel sınıfın bir şeyleri düzgün bir şekilde izlemesine izin verir. Geçersiz kılınabilir bir başlatma işlevi sağlayan, ancak başlatılıp başlatılmadığını belirlemek için duruma sahip olması gereken bir temel sınıf düşünün:
class Base
{
private:
bool m_bInitialized;
public:
virtual void Initialize() = 0;
void setInitialized() { m_bInitialized = true; };
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
Burada her şey iyi ve güzel. Türetilmiş bir sınıf, hiç setInitialized()
kimsenin onu arayabileceği gerçeğini aramakla uğraşmadığı sürece (bunu burada koruyabiliriz ve korumalı yöntemleri kullanmak için başka bir neden!). Sanal korumalı üyeleri kullanan bir sınıfı tercih ederim:
class Base
{
private:
bool m_bInitialized;
protected:
virtual void InitializeImpl() = 0;
public:
void Initialize()
{
InitializeImpl();
m_bInitialized = true;
}; // eo Initialize
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
Yeni sınıfımızda, tüm başlatma hala türetilmiş sınıfa devredilir. Atılan istisna olması durumunda, yöntemimizin gerçekleşeceğini söylediği "bu sınıf başlatıldı" sözleşmesini sürdürüyoruz.