Bir sanal üyeyi özel ilan etmek için yapılan tüm çağrılara rağmen, argüman su tutmuyor. Sıklıkla, türetilmiş bir sınıfın bir sanal işlevi geçersiz kılması, temel sınıf sürümünü çağırmak zorunda kalacaktır. Bildirilirse yapamaz private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
Sen sahip temel sınıf yöntemi ilan etmek protected
.
Ardından, bir yorum yoluyla yöntemin geçersiz kılınması, ancak çağrılmaması gerektiğini belirtmenin çirkin bir yolunu almalısınız.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Böylece Herb Sutter'ın 3 numaralı kuralı ... Ama at yine de ahırdan çıktı.
protected
Herhangi bir türetilmiş sınıfın yazarına, korumalı iç kısımları anlamak ve doğru bir şekilde kullanmak için örtük olarak güvendiğiniz bir şey bildirdiğinizde , tıpkı bir friend
bildirimin private
üyeler için daha derin bir güveni ifade ettiği gibi .
Bu güveni ihlal etmekten kötü davranışlar alan kullanıcılar (örneğin, belgelerinizi okumaya zahmet etmeyerek "bilgisiz" olarak etiketlenenler) suçlu sadece kendileri olur.
Güncelleme : Özel sanal işlevleri kullanarak bu şekilde sanal işlev uygulamalarını "zincirleyebileceğinizi" iddia eden bazı geri bildirimler aldım. Öyleyse, kesinlikle görmek isterim.
Kullandığım C ++ derleyicileri, türetilmiş bir sınıf uygulamasının özel bir temel sınıf uygulamasını çağırmasına kesinlikle izin vermez.
C ++ komitesi bu özel erişime izin vermek için "özel" i rahatlatırsa, tamamen özel sanal işlevler için olurum. Halen, at çalındıktan sonra ahır kapısını kilitlememiz tavsiye ediliyor.