0Pricing
C++ Academy · Ders

Statik Çok Biçimlilik

Sanal çağrı ek yükünden kaçının

Statik Çok Biçimlilik, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

İki Tür Çok Biçimlilik

C++, çok biçimliliğin iki türünü destekler.

  • Dinamik: sanal işlevler, çalışma zamanında sanal işlev tablosu aracılığıyla çözümlenir
  • Statik: şablonlar ve CRTP, derleme zamanında çözümlenir

Statik çok biçimlilik, hız karşılığında esneklikten ödün verir.

virtual Maliyeti

Sanal bir çağrı, sanal işlev tablosu üzerinden dolaylı bir sıçrama gerektirir. Derleyici genellikle bunu satır içine alamaz; bu da birçok iyileştirmeyi engeller.

#include <iostream>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};

struct Square : Shape {
    double s;
    Square(double x) : s(x) {}
    double area() const override { return s * s; }
};

int main() {
    Shape* p = new Square(3);
    std::cout << p->area() << "\n";
    delete p;
    return 0;
}

CRTP ile Statik Dağıtım

CRTP ile taban sınıf, türetilmiş sınıfın yöntemini derleme zamanında yapılan bir dönüştürme aracılığıyla doğrudan çağırır; böylece derleyici her şeyi satır içine alabilir.

#include <iostream>

template <typename T>
struct Shape {
    double area() const { return static_cast<const T*>(this)->area(); }
};

struct Square : Shape<Square> {
    double s;
    Square(double x) : s(x) {}
    double area() const { return s * s; }
};

int main() {
    Square sq(3);
    std::cout << sq.area() << "\n";
    return 0;
}

Yönlendirici Adlandırma

Taban ve türetilmiş sınıfın her ikisi de area tanımladığında, taban sınıfın yönlendiricisine compute gibi farklı bir ad verin; böylece türetilmiş sınıftaki uygulamaya belirsiz olmadan çağrı yapılır.

#include <iostream>

template <typename T>
struct Shape {
    double compute() const { return static_cast<const T*>(this)->area(); }
};

struct Circle : Shape<Circle> {
    double r;
    Circle(double x) : r(x) {}
    double area() const { return 3.14159 * r * r; }
};

int main() {
    Circle c(2);
    std::cout << c.compute() << "\n";
    return 0;
}

Statik Çok Biçimlilik Olarak Şablonlar

Yalın işlev şablonları da statik çok biçimliliktir: gerekli arayüzü sağlayan her tür için aynı kod çalışır (derleme zamanında ördek tiplemesi).

#include <iostream>

struct Dog { void speak() const { std::cout << "Woof\n"; } };
struct Cat { void speak() const { std::cout << "Meow\n"; } };

template <typename Animal>
void make_speak(const Animal& a) { a.speak(); }

int main() {
    make_speak(Dog{});
    make_speak(Cat{});
    return 0;
}

Tür Bilindiğinde

Statik polimorfizm yalnızca somut tür derleme zamanında biliniyorsa uygulanabilir. Heterojen nesneleri tek bir kapsayıcıda saklamanız ve davranışı çalışma zamanında seçmeniz gerekiyorsa yine de sanal işlevlere ihtiyacınız vardır.

Heterojen Kapsayıcılar Yok

Shape<Square> ile Shape<Circle> türlerini ortak bir temel sınıf olarak aynı std::vector içine koyamazsınız; çünkü bunlar ilişkisiz türlerdir. Bu, statik polimorfizmin temel sınırlamasıdır.

Performans Kazancı

Yönlendirilen çağrıyı satır içine yerleştiren derleyici, sabitleri hesaplayıp işlev çağrısı ek yükünü tamamen ortadan kaldırabilir. Tek bir bilinen tür üzerinde çalışan yoğun döngülerde statik polimorfizm önemli ölçüde daha hızlı olabilir.

#include <iostream>

template <typename T>
struct Op {
    int apply(int x) const { return static_cast<const T*>(this)->apply(x); }
};

struct Doubler : Op<Doubler> {
    int apply(int x) const { return x * 2; }
};

int main() {
    Doubler d;
    int sum = 0;
    for (int i = 0; i < 5; ++i) sum += d.apply(i);
    std::cout << sum << "\n";
    return 0;
}

İkisini Birleştirme

Sıcak yol için CRTP, tür silmenin gerektiği durumlarda ise ince bir sanal sarmalayıcı kullanabilirsiniz. Böylece önemli olduğu yerde hız, gerektiği yerde esneklik elde edersiniz.

Statik Arayüz Denetimleri

Türetilmiş bir sınıf gerekli yöntemi uygulamayı unutursa hata, çalışma zamanında değil, temel sınıf yönlendiricisi örneklendirildiğinde derleme zamanında ortaya çıkar.

#include <iostream>

template <typename T>
struct Greeter {
    void greet() const { static_cast<const T*>(this)->hello(); }
};

struct English : Greeter<English> {
    void hello() const { std::cout << "Hello\n"; }
};

int main() {
    English{}.greet();
    return 0;
}

Doğru Aracı Seçme

Statik polimorfizmi şu durumlarda kullanın:

  • Tür derleme zamanında biliniyorsa
  • Performans kritikse
  • Ortak bir çalışma zamanı temel türüne ihtiyacınız yoksa

Aksi durumda, açıklık ve esneklik için sanal işlevleri tercih edin.

Hızlı Kontrol

Statik polimorfizmin temel ödünleşimini seçin.

Özet

Statik ve dinamik polimorfizmi karşılaştırdınız.

  • Sanal = çalışma zamanında yönlendirme, sanal işlev tablosu, heterojen kapsayıcılar
  • CRTP/şablonlar = derleme zamanında yönlendirme, satır içine yerleştirilebilir, daha hızlı
  • Statik yaklaşımda türün derleme zamanında bilinmesi gerekir
  • Esneklik ve performans gereksinimlerinize göre seçim yapın

Sıkça Sorulan Sorular

“Statik Çok Biçimlilik” dersi ücretsiz mi?

Evet — “Statik Çok Biçimlilik” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Statik Çok Biçimlilik” dersinde ne öğreneceğim?

Sanal çağrı ek yükünden kaçının C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Statik Çok Biçimlilik” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. CRTP İdiomu
  2. Statik Çok Biçimlilik
  3. CRTP ile Mixin'ler
  4. CRTP Ne Zaman Kullanılır
← C++ Academy Sayfasına Dön