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?

Çözüm

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:

class Base 
{
    // some virtual methods
};

class Derived : public Base
{
    ~Derived()
    {
        // Do some important cleanup
    }
};

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 *b = new Derived();
// use b
delete b; // Here's the problem!

Base'in yıkıcısı virtual olmadığından ve b bir Derived nesnesine işaret eden bir Base* olduğundan, delete b tanımlanmamış davranışa sahiptir:

[delete b] içinde, eğer statik tip silinecek nesne dinamik tipinden farklıysa, statik tipi, nesnenin dinamik tipinin bir temel sınıfı olmalıdır. silinmiş ve statik tipin sanal bir yıkıcısı olmalı veya davranışı tanımsızdır.

Ç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.

Yorumlar (10)

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.

Yorumlar (7)

Sınıfınız polimorfik olduğunda yıkıcıyı sanal yapın.

Yorumlar (0)