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ştirsoyutlama.


🔒 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() ve getYas() 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 bile Daire 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

Sitedeki popüler yayınlar:

Kullanım Alanlarına Göre Farklı Linux Dağıtımları 3

Bilgisayar Ağları - Ağ Güvenliği

Bilgisayar Ağları - Kablosuz ve Mobil Ağlar