CodeBlanks Logo Icon CodeBlanks

virtual destructor

Sanal destructor ile doğru temizlik öğrenirsin.

virtual destructor

Bir sınıfın sanal yıkıcısı (virtual destructor) olduğunda, taban işaretçi üzerinden delete yapıldığında türetilmiş sınıfın yıkıcısı da çalışır.

Örnek: Base* b = new Derived();. Eğer ~Base virtual değilse, delete b; yalnız Base yıkıcısını çağırır; Derived yıkıcısı atlanır. Bu, bellek sızıntısına ve tanımsız davranışa yol açar. Çözüm: virtual ~Base() { }. Yıkıcıyı virtual yapmak, polimorfik sınıflarda zorunludur.

Sanal yıkıcı gereği

Bir sınıfta en az bir virtual metot varsa, yıkıcının da virtual yapılması gerekir. Bu, polimorfik kullanımda doğru temizliği garanti eder.

Yıkıcı virtual olduğunda, delete en türetilmiş yıkıcıdan başlar ve yukarı doğru çağırır. Önce ~Derived, sonra ~Base çalışır. Her iki sınıfın kaynakları da serbest bırakılır. Bu, C++'ta polimorfik sınıf tasarımının temel bir gereğidir.

Uygulama Sanal yıkıcı ile doğru temizlik

Base sınıfı tanımla; virtual ~Base() gövdesi std::cout << "Base yok";. Derived sınıfı miras alıp ~Derived() override gövdesi std::cout << "Derived yok ";. main içinde Base* b = new Derived(); ve delete b; yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// Base ve Derived sınıflarını tanımla

int main() {
    // Base* ile Derived oluştur ve delete yap
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Base {
public:
    virtual ~Base() { std::cout << "Base yok"; }
};

class Derived : public Base {
public:
    ~Derived() override { std::cout << "Derived yok "; }
};

int main() {
    Base* b = new Derived();
    delete b;
    return 0;
}

Beklenen çıktı

Derived yok Base yok

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sanal yıkıcı bildirimini tamamla

Soru
class Base { public: virtual ____() { } };
Cevap
class Base { public: virtual ~Base() { } };

Açıklama: ~Base, yıkıcı adıdır; virtual ile sanal yapılır.

2 Sanal yıkıcı ne zaman gereklidir?

main.cpp
Base* b = new Derived();
delete b;
  • Yalnız tek sınıfta
  • Taban işaretçiyle delete edildiğinde Doğru cevap
  • Asla
  • Yalnız yapı (struct) kullanınca

Açıklama: Taban işaretçiyle delete'te türetilmiş yıkıcı için sanal yıkıcı şart.

3 Bileşeni rolüne eşle

Kavram Anlamı
virtual ~Base Sanal yıkıcı
delete b Temizlik çağrısı
~Derived Türetilmiş yıkıcı
Base* Taban işaretçi

Orta seviye bölümündeki tüm dersler