Sanal yıkıcılar ne zaman kullanılmalı?
Çoğu OO teorisi hakkında sağlam bir anlayışa sahibim ancak kafamı en çok karıştıran şey sanal yıkıcılar.
Yıkıcının ne olursa olsun ve zincirdeki her nesne için her zaman çağrıldığını sanıyordum.
Bunları ne zaman sanal hale getireceksiniz ve neden?
1409
3
Sanal yıkıcılar, temel sınıfa bir işaretçi aracılığıyla türetilmiş bir sınıfın bir örneğini silme olasılığınız olduğunda kullanışlıdır:
Burada, Base'in yıkıcısını `virtual' olarak bildirmediğimi fark edeceksiniz. Şimdi, aşağıdaki parçacığa bir göz atalım:
Base'in yıkıcısı
virtual
olmadığından veb
birDerived
nesnesine işaret eden birBase*
olduğundan,delete b
tanımlanmamış davranışa sahiptir:Çoğu uygulamada, yıkıcıya yapılan çağrı sanal olmayan herhangi bir kod gibi çözümlenecektir, yani temel sınıfın yıkıcısı çağrılacak ancak türetilmiş sınıfınki çağrılmayacak ve bu da kaynak sızıntısına neden olacaktır.
Özetle, temel sınıflar polimorfik olarak manipüle edilmek istendiğinde her zaman yıkıcıları `sanal' yapın.
Bir temel sınıf işaretçisi aracılığıyla bir örneğin silinmesini önlemek istiyorsanız, temel sınıf yıkıcısını korumalı ve sanal olmayan yapabilirsiniz; bunu yaparak, derleyici bir temel sınıf işaretçisi üzerinde
delete
çağrısı yapmanıza izin vermez.Sanallık ve sanal temel sınıf yıkıcısı hakkında daha fazla bilgiyi Herb Sutter'ın bu makalesinden öğrenebilirsiniz.
Polimorfik temel sınıflarda yıkıcıları sanal olarak bildirme. Bu, Scott Meyers' Effective C++'deki 7. Maddedir. Meyers, bir sınıfın herhangi bir sanal işlevi varsa, sanal bir yıkıcıya sahip olması gerektiğini ve temel sınıf olarak tasarlanmamış ya da polimorfik olarak kullanılmak üzere tasarlanmamış sınıfların sanal yıkıcı bildirmemesi gerektiğini özetlemektedir.
Sınıfınız polimorfik olduğunda yıkıcıyı sanal yapın.