CodeBlanks Logo Icon CodeBlanks

Sanal tablo

Sanal metot tablosu (vtable) ve çalışma zamanı dağıtımını öğrenirsin.

Sanal tablo

Sanal tablo (vtable), virtual metotları olan her sınıf için derleyici tarafından oluşturulan bir veri yapısıdır. Her nesne, kendi sınıfının vtable'ına gizli bir işaretçi taşır.

Çalışma zamanında a->speak() çağrısı, vtable üzerinden doğru uygulamayı bulur. Örneğin Shape taban sınıfı ve Circle, Square türetilmiş sınıfları olsun. Shape* dizisinde her nesne kendi vtable'ını kullanır; ->area() çağrısı doğru değeri döndürür. vtable, küçük bir maliyet karşılığında polimorfizm sağlar.

vtable maliyeti

Sanal tablo her nesneye bir işaretçi ekler; bu, bellekte ufak bir artışa neden olur. Ayrıca her sanal metot çağrısı dolaylı (indirect) olduğu için bir adım daha yavaştır.

Bu maliyet çoğu durumda ihmal edilebilir. Polimorfizm gücü için ödenmeye değer. Eğer performans çok kritikse ve polimorfizme gerek yoksa virtual kullanmaktan kaçınabilirsin. Ama bir sınıfın yıkıcısı virtual olacaksa, vtable zaten oluşur; ek metotların virtual yapılması ek maliyet getirmez.

Uygulama Shape hiyerarşisi ile vtable dene

Shape sınıfı tanımla; virtual int area() gövdesi return 0;. Circle ve Square Shape'ten miras alsın; area() override sırasıyla return 314; ve return 100;. main içinde iki Shape* oluştur, std::cout << s1->area() << " " << s2->area(); yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// Shape, Circle ve Square sınıflarını tanımla

int main() {
    // İki Shape* oluştur ve alanları yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Shape {
public:
    virtual int area() { return 0; }
};

class Circle : public Shape {
public:
    int area() override { return 314; }
};

class Square : public Shape {
public:
    int area() override { return 100; }
};

int main() {
    Shape* s1 = new Circle();
    Shape* s2 = new Square();
    std::cout << s1->area() << " " << s2->area();
    return 0;
}

Beklenen çıktı

314 100

Soru ve cevaplar

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

1 Bileşeni anlamına eşle

Kavram Anlamı
vtable Sanal tablo
virtual vtable girişi
Shape* Dinamik bağlama
override Geçersiz kılma

2 Sanal tablo ne zaman oluşturulur?

main.cpp
class Shape { public: virtual int area(); };
  • Çalışma zamanında
  • Yıkıcıda
  • Derleme zamanında Doğru cevap
  • Yalnız hata ayıklarken

Açıklama: vtable, virtual metotlar için derleme zamanında oluşturulur.

3 İşaretçi atamasını tamamla

Soru
Shape* s = new ____();
Cevap
Shape* s = new Circle();

Açıklama: Türetilmiş sınıf örneği taban işaretçiye atanır.

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