Virtual Function'lar: Polymorphism Nasıl Çalışıyor ve Maliyeti Nedir?

# Virtual Function'lar: Polymorphism Nasıl Çalışıyor ve Maliyeti Nedir?

Polymorphism, bir pointer veya referans üzerinden farklı türlerin aynı fonksiyonunu çağırabilmektir. Örneğin `Animal` türündeki pointer, `Dog` veya `Cat` nesnesine işaret edebilir ve her birinin kendi `sound()` fonksiyonu çalışır.

Bir sınıfta `virtual` anahtar kelimesi kullanırsanız, C++ derleyicisi o sınıfa gizli bir vtable (virtual method table) ekler. Bu tablo, her virtual fonksiyonun gerçek adresini tutar.

Çalışma süresi (runtime) sırasında pointer türüne bakılmaz; nesnenin gerçek türü kontrol edilir ve vtable'dan doğru fonksiyon bulunup çağrılır.

1#include <iostream>
2using namespace std;
3
4class Animal {
5public:
6virtual void sound() {
7cout << "Bilinmeyen ses" << endl;
8}
9virtual ~Animal() {}
10};
11
12class Dog: public Animal {
13public:
14void sound() override {
15cout << "Hav hav!" << endl;
16}
17};
18
19class Cat: public Animal {
20public:
21void sound() override {
22cout << "Miyav!" << endl;
23}
24};
25
26int main() {
27Dog dog;
28Cat cat;
29
30Animal* animals[2] = {&dog, &cat};
31
32for (int i = 0; i < 2; i++) {
33animals[i]->sound();
34}
35
36return 0;
37}

Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Hav hav!
2Miyav!

Vtable Arama: Her virtual fonksiyon çağrısında, vtable'dan doğru adres bulunması gerekir. Bu, doğrudan fonksiyon çağrısından 1-2 nanosaniye daha yavaştır.

Bellek Kullanımı: Virtual fonksiyon içeren her nesne, 8 baytlık vtable pointer taşır. Binlerce nesne varsa bu fark görülür.

Inline Edilemez: Derleyici, virtual fonksiyonları compile time'da inline edemez çünkü hangi fonksiyonun çalışacağı runtime'da belli olur.

Polymorphism gerekli olduğunda kullan. Eğer `Animal*` pointer'ı ile farklı hayvan türlerini yöneteceksen, virtual fonksiyon şarttır. Ama performans kritik koda (örneğin oyun loop'u) vtable araması eklemek istiyorsan, template kullan.

Özetle: Virtual function'lar esneklik sağlar ama maliyeti vardır. Doğru yerde doğru araç seç.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz