Sobes.tech
Junior

C++ dilinde virtual anahtar kelimesi hakkında ne biliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

C++'ta virtual, temel sınıfta sanal fonksiyonları bildirmek için kullanılır. Bu, çalışma zamanında çok biçimlilik (runtime polymorphism) uygulamayı sağlar.

Uygulama:

  • Temel sınıfta, türetilmiş sınıflarda geçersiz kılınabilecek (override) bir fonksiyon tanımlar.
  • Bir sanal fonksiyon, temel sınıfa işaret eden bir gösterici veya referans aracılığıyla çağrıldığında, aslında türetilmiş sınıf nesnesindeki fonksiyonun uygulaması çağrılır (eğer geçersiz kılınmışsa). Bu, çalışma zamanında sanal fonksiyon tablosu (vtable) aracılığıyla gerçekleşir.

Ana noktalar:

  • Sadece sınıf üyesi fonksiyonlar sanal olabilir. Küresel fonksiyonlar, statik fonksiyonlar ve yapıcılar sanal olamaz.
  • Yıkıcılar (destructors), genellikle sanal olmalı ve olmalıdır, böylece temel sınıfa işaret eden gösterici kullanılarak türetilmiş sınıf nesneleri silinirken bellek sızıntıları önlenir.
  • Bir fonksiyon temel sınıfta virtual olarak bildirilmişse, tüm türetilmiş sınıflarda otomatik olarak sanal kalır, hatta virtual anahtar kelimesi kullanılmasa bile (daha fazla açıklık için virtual ve override kullanılması önerilir).
  • Sadece sanal fonksiyonlar = 0 ile bildirilir ve soyut sınıf yapar. Bu sınıf doğrudan örneklendirilemez.

Örnek:

#include <iostream>

class Base {
public:
    virtual void print() {
        std::cout << "Base'ten" << std::endl;
    }

    virtual ~Base() {
        std::cout << "Base yıkıcı" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override { // override kullanımı, açıkça geçersiz kılmayı belirtir
        std::cout << "Derived'ten" << std::endl;
    }

    ~Derived() override { // override kullanımı
        std::cout << "Derived yıkıcı" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived(); // temel sınıf işaretçisi, türetilmiş nesneye işaret eder

    ptr->print(); // sanal fonksiyon nedeniyle Derived::print() çağrılır
    delete ptr;   // sanal yıkıcı sayesinde Derived ve sonra Base yıkıcıları çağrılır

    return 0;
}

İlgili kavramlar:

  • vtable (sanal fonksiyon tablosu): Sınıfın sanal fonksiyonlarına işaret eden göstericilerin tablosu. Her sanal fonksiyon içeren nesne, görünmeyen bir vptr göstericisi içerir ve bu, sınıfın vtable'ına işaret eder.
  • vptr (vtable göstericisi): Çalışma zamanında çağrılacak fonksiyonu belirlemek için gereklidir.
  • = 0 (sanal saf fonksiyon): Bu fonksiyonun bu sınıfta uygulanmadığını gösterir, sınıfı soyut yapar.
  • override (geçersiz kılma belirteci): Türetilmiş sınıftaki fonksiyonun, temel sınıfın sanal fonksiyonunu açıkça geçersiz kıldığını belirtir. Derleyicinin hataları tespit etmesine yardımcı olur.
  • final (belirteç): Daha fazla sanal fonksiyon geçersiz kılmayı veya sınıfın kalıtımını engeller.

Özetle: virtual, C++'ta kalıtım ve dinamik bağlama yoluyla çok biçimliliği uygulamanın temel mekanizmasıdır.