Hanya sebuah contoh yang pernah saya gunakan di masa lalu. Metode yang dilindungi sangat bagus untuk menyediakan fungsi implementasi spesifik, sementara juga memungkinkan kelas dasar untuk melacak hal-hal dengan benar. Pertimbangkan kelas dasar yang menyediakan fungsi inisialisasi yang dapat ditimpa, tetapi juga harus memiliki status untuk menentukan apakah diinisialisasi:
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
Semua baik-baik saja di sini. Kecuali ketika kelas turunan tidak repot-repot memanggil setInitialized()
fakta bahwa siapa pun dapat menyebutnya (kita bisa membuat ini terlindungi di sini, dan alasan lain untuk menggunakan metode yang dilindungi!). Saya lebih suka kelas yang menggunakan anggota yang dilindungi virtual:
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
Di kelas baru kami, semua inisialisasi masih didelegasikan ke kelas turunan. Asalkan pengecualian telah dilempar, kami mempertahankan kontrak "kelas ini diinisialisasi" yang menurut metode kami akan terjadi.