Soru Korumalı vs özel yıkıcı


C ++ 'da korunan ve özel bir yıkıcı arasında bir fark var mı? Bir temel sınıf yıkıcı özelse, türetilmiş sınıf nesnesini silerken hala çağrıldığını hayal ediyorum.


24
2017-07-14 13:50


Menşei


Sınıftan özel destructor =) ile ilgili bazı sorunlarınız olacaktır. - SadSido
İçin çoğalt stackoverflow.com/questions/631783/... ? - SadSido
Burada benzer bir soru: stackoverflow.com/questions/224966/... - Jordan


Cevaplar:


Dan alınan İşte:

Kurucu / yıkıcı özel olarak ilan edilirse, sınıf başlatılamaz.

Bu doğrudur, ancak sınıftaki başka bir yöntemden örneklenebilir. Benzer şekilde, yıkıcı ise privateDaha sonra nesne sadece sınıfın içinden de silinebilir. Ayrıca, sınıfın miras alınıp alınmamasını (veya en azından miras alınan sınıfa getirilmesinin / yok edilmesinin önüne geçilmesini) önler.


13
2017-07-14 13:53



kamu sınıfı A {private A () {} public A getA () {return new A (); }} Tam olarak doğru değil. - Stefan Kendall
Bu doğru değil. Özel yıkıcı ile nesne kutu örnek alınabilir, (örneğin bir arkadaş işlevinin içindeki bir yığında). - SadSido
Sağ, yığın olarak tahsis edilemez ama ayrılan yığın ve aynı zamanda arkadaş fonksiyonlarından da olabilir ... - Brian R. Bondy
Ayrıca, yıkıcı korumalı ise, bu da korunan ve özel arasında bir fark yaratmaz. - Mike Seymour
Eksik gerçek: Yapabilirsiniz new Özel bir yıkıcıya sahip bir sınıf, ama sen delete (üye fonksiyonlarının ve arkadaş fonksiyonlarının dışında). - Thomas Eding


Temel sınıf yıkıcı ise private veya protected o zaman arayamazsın delete taban sınıfı işaretçisi aracılığıyla.

Türetilmiş bir nesnenin temel sınıf bir işaretçi ile yok edilmesini önlemek için korumalı bir yıkıcı kullanın. Türetilmiş sınıflara imha edici erişimi sınırlar. Ve otomatik engeller (taban) sınıf tabanı nesneleri.

Aslında kullanılır izin vermek   diğer türetilen polimorfik kullanım   Tabana işaretçiler aracılığıyla sınıflar   kullanıcıların böyle kullanarak silmelerine izin ver   Işaretçi. Örnek: - Soyut Temel Sınıflar / Arayüzler.

Ancak protected, non-virtual yıkıcı gerçekleşmesini bekleyen bir hata gibi görünüyor. Bir destroy() fonksiyonu, sonunda dtor kamuoyuna yapmak zorunda. Bunu yapar yapmaz, sınıf üzerinde daha fazla kontrole sahip olmazsınız ve eğer birisi sınıfınızdan daha ileriye gelirse, sanal olmayan bir dtor ile polimorfik silme riskini çalıştırırsınız.


23
2017-07-14 13:56





Cevap, senin varsayımın yanlış. Özel sınıf yok edici özel olduğunda çağrılmaz.


6
2017-07-14 13:59



Peki sınıfım nasıl yok edilir? - doron
@ deus-ex-machina399: Yapamaz. Bu yüzden ondan türetilemezsiniz. Ve otomatik nesneler oluşturamazsınız. Ve dinamik nesneler asla silinemez (bunu yapan bir üye işlevi sağlamazsanız). - sbi


Aşağıdaki kod parçası derleyici hatasıyla sonuçlanır (VC2010): C2248: 'base :: ~ base': 'base' sınıfında bildirilen özel üyeye erişemez

class base
{
    ~base(){}
};

class derived : public base
{
};

int main ()
{
    derived* d = new derived;

    delete d;
}

Ancak, korunacak olan temel yıkıcıyı değiştirirseniz, her şey iyi çalışır.


6
2017-07-14 13:58



Ama sen onu değiştirmiş olsan bile protectedNesneleri bir sınıf sınıfı işaretçisiyle yok edemezsiniz. (Bu durumda aynı zamanda virtual, BTW.) Bir şekilde türetme amaçlarının bir kısmını yener ... - sbi