Sanal tablo
- C++ kursu
- Orta seviye
- Ders 37/116
- 5 dk
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
#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
#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?
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
Shape* s = new ____();
Shape* s = new Circle();
Açıklama: Türetilmiş sınıf örneği taban işaretçiye atanır.