C++ Soyutlama (Abstraction), Kapsülleme (Encapsulation), Kalıtım/Miras (Inheritance), Çok Şekillilik/Çok Biçimlilik (Polymorphism)
C++ dilinde Nesne Yönelimli Programlama (OOP)'nın temel taşları:
-
🧱 Soyutlama (Abstraction)
-
🔒 Kapsülleme (Encapsulation)
-
🧬 Kalıtım / Miras (Inheritance)
-
🎭 Çok Biçimlilik (Polymorphism)
🧱 1. Soyutlama (Abstraction)
Tanım:
Karmaşık sistemleri daha basit hale getirmek için sadece gerekli bilgilerin gösterilmesi, gereksiz detayların gizlenmesidir.
🧠 Yani: "Ne yaptığı önemli, nasıl yaptığı önemli değil."
✅ Örnek:
#include <iostream>
using namespace std;
class BankaHesabi {
public:
void paraYatir(double miktar) {
bakiye += miktar;
}
void bakiyeGoster() {
cout << "Bakiye: " << bakiye << " TL" << endl;
}
private:
double bakiye = 0.0; // Detaylar gizli
};
int main() {
BankaHesabi hesap;
hesap.paraYatir(1000);
hesap.bakiyeGoster();
return 0;
}
📌 Açıklama:
Kullanıcı bakiye
değişkenine direkt ulaşamaz. Sadece paraYatir()
ve bakiyeGoster()
fonksiyonları ile işlem yapabilir.
Yani banka sisteminin iç yapısı gizlenmiştir → soyutlama.
🔒 2. Kapsülleme (Encapsulation)
Tanım:
Verileri ve o veriler üzerinde işlem yapan fonksiyonları bir sınıf içinde toplama işlemidir.
Ayrıca, bu verileri dışarıdan koruma (gizleme) anlamına da gelir.
✅ Örnek:
#include <iostream>
using namespace std;
class Ogrenci {
private:
int yas;
public:
void setYas(int y) {
if (y > 0)
yas = y;
}
int getYas() {
return yas;
}
};
int main() {
Ogrenci ali;
ali.setYas(20);
cout << "Ali'nin yaşı: " << ali.getYas() << endl;
return 0;
}
📌 Açıklama:
-
yas
değişkeni private olduğu için dışarıdan doğrudan erişilemez. -
setYas()
vegetYas()
fonksiyonlarıyla veri kontrol edilir.
Bu, veri koruması ve erişim kontrolü sağlar → kapsülleme.
🧬 3. Kalıtım / Miras (Inheritance)
Tanım:
Bir sınıfın başka bir sınıftan özellik ve davranışları miras almasıdır.
✅ Örnek:
#include <iostream>
using namespace std;
// Ana sınıf
class Arac {
public:
void hareketEt() {
cout << "Araç hareket ediyor." << endl;
}
};
// Türeyen sınıf
class Araba : public Arac {
public:
void kornaCal() {
cout << "Korna çalındı: Bip bip!" << endl;
}
};
int main() {
Araba bmw;
bmw.hareketEt(); // Miras alınan fonksiyon
bmw.kornaCal(); // Kendi fonksiyonu
return 0;
}
📌 Açıklama:
-
Araba
,Arac
sınıfından kalıtım almıştır. -
hareketEt()
fonksiyonu türeyen sınıfta kullanılabilir.
🎭 4. Çok Biçimlilik (Polymorphism)
Tanım:
Aynı isimli fonksiyonların farklı şekillerde davranabilmesidir.
2 türü vardır:
-
Fonksiyon Aşırı Yükleme (Overloading) → Aynı sınıfta farklı parametrelerle
-
Fonksiyon Ezme (Overriding) → Türeyen sınıfta farklı davranış
🧪 4.1 Fonksiyon Aşırı Yükleme (Overloading)
#include <iostream>
using namespace std;
class Hesaplayici {
public:
int topla(int a, int b) {
return a + b;
}
double topla(double a, double b) {
return a + b;
}
};
int main() {
Hesaplayici h;
cout << h.topla(3, 4) << endl;
cout << h.topla(2.5, 3.7) << endl;
return 0;
}
📌 Açıklama:
Aynı isimli topla
fonksiyonu farklı parametrelerde çalışır → polymorphism.
🧪 4.2 Fonksiyon Ezme (Overriding - Dynamic Polymorphism)
#include <iostream>
using namespace std;
class Sekil {
public:
virtual void ciz() {
cout << "Şekil çiziliyor." << endl;
}
};
class Daire : public Sekil {
public:
void ciz() override {
cout << "Daire çiziliyor." << endl;
}
};
int main() {
Sekil* s = new Daire();
s->ciz(); // Daire çiziliyor (override edilmiş)
delete s;
return 0;
}
📌 Açıklama:
-
Sekil
sınıfıvirtual
fonksiyon içerir. -
Daire
sınıfı bu fonksiyonu override eder. -
Sekil*
türünde olsa bileDaire
fonksiyonu çalışır → çok biçimlilik.
🧩 Kısa Özet Tablosu
OOP Kavramı | Amaç | Anahtar Kelime / Yapı | Örnek |
---|---|---|---|
Soyutlama | Gereksiz detayları gizle | class , public , private |
Banka hesabı |
Kapsülleme | Veriyi gizle, dışarı açma | private , getter , setter |
Öğrenci sınıfı |
Kalıtım | Kod tekrarını azalt | class A : public B |
Araba, Araç |
Çok Biçimlilik | Esneklik, override | virtual , override |
Sekil → Daire |
🎓 4 temel OOP kavramını içeren "Personel Yönetim Sistemi" projesi:
Bu örnek:
🔹 Soyutlama
🔹 Kapsülleme
🔹 Kalıtım (Miras)
🔹 Çok Biçimlilik (Polymorphism)
hepsini tek bir senaryoda gösteriyor.
🎯 Proje: Personel Yönetim Sistemi
🎓 Senaryo:
Bir şirkette farklı çalışan türleri vardır:
-
Calisan
→ Temel sınıf (soyut) -
Mudur
,Yonetici
→ Ondan türeyen sınıflar
Her çalışanın adı vardır, fakat her biri farklı şekilde maaş alır.
✅ Kod:
#include <iostream>
using namespace std;
// SOYUT SINIF → Soyutlama (Abstraction)
class Calisan {
protected:
string ad;
public:
Calisan(string ad) {
this->ad = ad;
}
// Soyut (pure virtual) fonksiyon
virtual double maasHesapla() = 0;
void adYazdir() {
cout << "Ad: " << ad << endl;
}
virtual ~Calisan() {}
};
// TÜREYEN SINIF → Kapsülleme + Kalıtım + Override
class Mudur : public Calisan {
private:
double tabanMaas;
double prim;
public:
Mudur(string ad, double tabanMaas, double prim)
: Calisan(ad), tabanMaas(tabanMaas), prim(prim) {}
double maasHesapla() override {
return tabanMaas + prim;
}
};
// TÜREYEN SINIF → Farklı maaş hesabı
class Yonetici : public Calisan {
private:
double saatlikUcret;
int calismaSaati;
public:
Yonetici(string ad, double saatlikUcret, int calismaSaati)
: Calisan(ad), saatlikUcret(saatlikUcret), calismaSaati(calismaSaati) {}
double maasHesapla() override {
return saatlikUcret * calismaSaati;
}
};
// ANA PROGRAM
int main() {
// POLYMORPHISM → Tüm çalışanlar aynı türden gösteriliyor
Calisan* personeller[2];
personeller[0] = new Mudur("Ayşe", 10000, 2500); // Mudur
personeller[1] = new Yonetici("Mehmet", 150, 160); // Yonetici
cout << "Personel Bilgileri:\n";
for (int i = 0; i < 2; i++) {
personeller[i]->adYazdir();
cout << "Maaş: " << personeller[i]->maasHesapla() << " TL\n";
cout << "-------------------\n";
}
// Belleği temizle
for (int i = 0; i < 2; i++) {
delete personeller[i];
}
return 0;
}
🖨️ Örnek Çıktı:
Personel Bilgileri:
Ad: Ayşe
Maaş: 12500 TL
-------------------
Ad: Mehmet
Maaş: 24000 TL
-------------------
🧠 Uygulanan OOP Kavramları:
Kavram | Açıklama |
---|---|
Soyutlama | Calisan sınıfı soyut sınıf. Kullanıcı detayla uğraşmaz. |
Kapsülleme | Değişkenler private . Bilgiler sınıf içinde saklanır. |
Kalıtım | Mudur ve Yonetici , Calisan sınıfından türedi. |
Polymorphism | Calisan* türünde tutulup farklı alt sınıflar çalıştırıldı. |
Yorumlar
Yorum Gönder