Yükleniyor...

Kalıtım

Kalıtım (Inheritance) C++’ta nesne yönelimli programlamanın temel taşlarından biridir ve bir sınıfın başka bir sınıftan özellik ve davranışlarını devralmasını sağlar. Kalıtım sayesinde tekrar eden kodlardan kaçınılır, yazılımın bakımı kolaylaşır ve modüler bir yapı elde edilir. Örneğin, bir "Araç" sınıfı temel özellikler olan marka ve yıl bilgilerini içerebilir, bu sınıftan türetilen "Araba" ve "Motorsiklet" sınıfları bu özellikleri devralırken kendilerine özgü ek nitelikler ekleyebilir. Bu, hem kod tekrarını önler hem de nesneler arasında hiyerarşik bir yapı kurar.
C++’ta kalıtım, public, protected ve private türlerinde olabilir ve sınıflar arası erişim kontrolleri sağlar. Kalıtım, birden fazla sınıfın ortak davranışlarını modellemek veya belirli bir arayüz üzerinden farklı nesne türlerini yönetmek gerektiğinde kullanılır. Bu eğitimde okuyucu, temel ve türetilmiş sınıfların oluşturulmasını, yapıcı ve yıkıcıların yönetilmesini, sanal fonksiyonlar ve polimorfizm kullanarak kalıtımın gerçek projelerde nasıl uygulanacağını öğrenecektir. Ayrıca C++ dilinin veri yapıları, algoritmalar ve OOP prensipleri ile nasıl entegre edileceği ve yazılım mimarisi bağlamında kalıtımın rolü de ele alınacaktır.

Temel Örnek

text
TEXT Code
\#include <iostream>
\#include <string>

class Arac {
protected:
std::string marka;
int yil;
public:
Arac(const std::string& m, int y) : marka(m), yil(y) {}
virtual void goster() const {
std::cout << "Marka: " << marka << ", Yıl: " << yil << std::endl;
}
virtual \~Arac() {}
};

class Araba : public Arac {
private:
int kapiSayisi;
public:
Araba(const std::string& m, int y, int k) : Arac(m, y), kapiSayisi(k) {}
void goster() const override {
std::cout << "Marka: " << marka << ", Yıl: " << yil << ", Kapı Sayısı: " << kapiSayisi << std::endl;
}
};

int main() {
Arac a("Genel", 2020);
Araba b("Toyota", 2023, 4);

a.goster();
b.goster();

Arac* ptr = &b;
ptr->goster(); // Polimorfizm gösterimi

return 0;

}

Bu örnekte, Arac sınıfı temel sınıf olarak marka ve yıl değişkenlerini protected olarak tanımlar ve goster fonksiyonu ile bilgileri ekrana yazdırır. Araba sınıfı Arac sınıfından public kalıtım ile türetilmiş olup ek olarak kapiSayisi değişkenini içerir. Araba, goster fonksiyonunu override ederek kendi ek bilgisini gösterir. main fonksiyonunda bir Arac nesnesi ve bir Araba nesnesi oluşturulur ve fonksiyon çağrıları yapılır. Polimorfizm, Arac* türündeki bir işaretçinin Araba nesnesini gösterirken doğru fonksiyonun çağrılmasıyla gösterilir. Ayrıca sanal yıkıcı kullanımı, nesne ömrü boyunca kaynak yönetimi ve bellek sızıntılarının önlenmesi açısından kritik öneme sahiptir. Bu örnek, C++’ta kalıtımın temel uygulamasını ve iyi uygulama pratiklerini gösterir.

Pratik Örnek

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <memory>

class Calisan {
protected:
std::string isim;
double maas;
public:
Calisan(const std::string& i, double m) : isim(i), maas(m) {}
virtual void goster() const {
std::cout << "Çalışan: " << isim << ", Maaş: " << maas << std::endl;
}
virtual double bonusHesapla() const = 0;
virtual \~Calisan() {}
};

class Mudur : public Calisan {
private:
int ekipBoyutu;
public:
Mudur(const std::string& i, double m, int e) : Calisan(i, m), ekipBoyutu(e) {}
void goster() const override {
std::cout << "Müdür: " << isim << ", Maaş: " << maas << ", Ekip: " << ekipBoyutu << std::endl;
}
double bonusHesapla() const override {
return maas * 0.1 + ekipBoyutu * 100;
}
};

class Gelistirici : public Calisan {
private:
std::string dil;
public:
Gelistirici(const std::string& i, double m, const std::string& d) : Calisan(i, m), dil(d) {}
void goster() const override {
std::cout << "Geliştirici: " << isim << ", Maaş: " << maas << ", Dil: " << dil << std::endl;
}
double bonusHesapla() const override {
return maas * 0.15;
}
};

int main() {
std::vector\<std::unique_ptr<Calisan>> ekip;
ekip.push_back(std::make_unique<Mudur>("Ali", 90000, 5));
ekip.push_back(std::make_unique<Gelistirici>("Veli", 80000, "C++"));

for (const auto& c : ekip) {
c->goster();
std::cout << "Bonus: " << c->bonusHesapla() << std::endl;
}

return 0;

}

Bu gelişmiş örnekte, Calisan sınıfı soyut bir sınıf olarak tasarlanmıştır ve bonusHesapla fonksiyonu saf sanal (pure virtual) olarak tanımlanmıştır. Mudur ve Gelistirici sınıfları Calisan’dan türetilmiş ve kendi bonus hesaplamalarını sağlar. std::unique_ptr kullanımı ile bellek yönetimi güvence altına alınır ve std::vector ile heterojen bir ekip yönetimi sağlanır. Polimorfik çağrılar sayesinde, Calisan işaretçileri farklı türev sınıfları doğru şekilde yönetir. Bu örnek, kalıtım, soyutlama, polimorfizm ve modern C++ iyi uygulamalarını bir arada göstererek gerçek dünya projelerinde uygulanabilir çözümler sunar.

Kalıtımda dikkat edilmesi gereken iyi uygulamalar arasında, sınıf hiyerarşilerini mümkün olduğunca derinleştirmemek, destructors sanal yapmak, üyeleri doğru şekilde protected/private olarak ayarlamak ve object slicing’den kaçınmak yer alır. STL ve akıllı işaretçiler kullanmak bellek yönetimini ve performansı iyileştirir. Hataları önlemek için valgrind gibi araçlarla bellek sızıntıları kontrol edilebilir. Güvenlik için kalıtım ilişkilerinde public inheritance tercih edilmeli ve gereksiz erişim izinlerinden kaçınılmalıdır.

📊 Referans Tablosu

C++ Element/Concept Description Usage Example
Temel Sınıf Diğer sınıfların türetildiği sınıf class Arac { /* üyeler */ };
Türetilmiş Sınıf Temel sınıftan miras alan sınıf class Araba : public Arac { /* üyeler */ };
Sanal Fonksiyon Türetilmiş sınıfta override edilebilir virtual void goster() const;
Saf Sanal Fonksiyon Türetilmiş sınıfta uygulanmalı virtual double bonusHesapla() const = 0;
Polimorfizm Çalışan işaretçinin doğru fonksiyonu çağırması Calisan* ptr = \&g; ptr->goster();
Başlatma Listesi Üye değişkenleri verimli başlatır Araba(const std::string& m,int y,int k): Arac(m,y), kapiSayisi(k) {}

C++’ta kalıtım, sınıflar arasında hiyerarşi kurarak kod tekrarını önler, modülerliği artırır ve polimorfizmi etkin kullanmayı sağlar. Temel kavramların ve iyi uygulamaların öğrenilmesi, sürdürülebilir ve performanslı C++ projeleri geliştirmek için kritiktir. Sonraki adımlar, çoklu kalıtım, soyut sınıflar, tasarım desenleri ve STL entegrasyonu gibi ileri seviye konuları içermelidir. Projelerde kalıtım kullanırken polimorfizm, akıllı işaretçiler ve uygun erişim kontrolleri ile güvenli ve ölçeklenebilir çözümler üretmek mümkündür.

🧠 Bilginizi Test Edin

Başlamaya Hazır

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
Sorular
🎯
70%
Geçmek İçin
♾️
Süre
🔄
Deneme

📝 Talimatlar

  • Her soruyu dikkatle okuyun
  • Her soru için en iyi cevabı seçin
  • Quiz'i istediğiniz kadar tekrar alabilirsiniz
  • İlerlemeniz üstte gösterilecek