Sanal yıkıcılar ne zaman kullanılır?
En OO teorisi sağlam bir anlayış var ama bana çok kafasını karıştıran tek şey sanal yıkıcılar.
Ve zincirin her nesne için ne kadar yıkıcı olursa olsun her zaman çağrılan düşündüm.
Onları ne zaman ve neden sanal olması gerekiyor mu?
CEVAP
Sanal yıkıcılar temel sınıf için bir işaretçi: türetilmiş bir sınıfın örneğini silmek için yararlıdır
class Base
{
// some virtual methods
};
class Derived : public Base
{
~Derived()
{
// Do some important cleanup
}
}
Burada, Temel yıkıcı sanal ilan etmedim fark edeceksiniz. Şimdi aşağıdaki kod bir göz atalım:
Base *b = new Derived();
// use b
delete b; // Here's the problem!
Temel yıkıcı değil sanal ve b
Derived
bir nesneye Base*
işaret, delete b
undefined behaviour vardır. En uygulamaları, çağrı için yıkıcı olacaktır çözülmüş gibi herhangi bir sanal olmayan bir kod, yani yıkıcı bir sınıf olacak denilen ama bir türetilmiş sınıf, elde edilen kaynakların sızıntı.
Özetle, her zaman temel sınıflar' polymorphically manipüle olmaları gerekiyor. virtual yıkıcılar olun
İsterseniz silinmesini engelle örneği üzerinden temel sınıf işaretçisi, sen-ebilmek yapmak temel sınıf destuctor korumalı ve pratik; böyle yaparak, derleyici izin vermiyor diyorsun silmek için bir temel sınıf işaretçisi.
Sanallık ve sanal temel sınıf this article from Herb Sutter yıkıcı hakkında daha fazla bilgi edinebilirsiniz.
ArrayList üzerinde LinkedList ne zaman...
Uygular vs Uzanır. Ne zaman kullanılır...
Reinterpret_cast ne zaman kullanılır?...
Vs İşaretçiler Başvuruları ne zaman ku...
Python Listesi vs Dizi ne zaman kullan...