# 3.8 Polimorfizm (Polymorphism)

Polimorfizm, nesne yönelimli programlamanın temel özelliklerinden biridir ve bir nesnenin farklı formlarda davranabilmesi anlamına gelir. C++ dilinde polimorfizm, genellikle iki ana türde bulunur: **statik (compile-time) polimorfizm** ve **dinamik (run-time) polimorfizm**.

**1. Statik Polimorfizm**

Statik polimorfizm, derleme zamanında belirlenir. Genellikle **fonksiyon aşırı yükleme** (function overloading) ve **operator aşırı yükleme** (operator overloading) ile gerçekleştirilir. Bu türde, aynı isimde birden fazla fonksiyon tanımlanabilir, ancak parametre sayısı veya türleri farklı olmalıdır.

**Örnek: Fonksiyon Aşırı Yükleme**

```cpp
#include <iostream>
using namespace std;

class Matematik {
public:
    int topla(int a, int b) {
        return a + b;
    }

    double topla(double a, double b) {
        return a + b;
    }
};

int main() {
    Matematik matematik;
    cout << "Tamsayı toplama: " << matematik.topla(5, 10) << endl; // 15
    cout << "Ondalık toplama: " << matematik.topla(5.5, 2.3) << endl; // 7.8
    return 0;
}
```

**2. Dinamik Polimorfizm**

Dinamik polimorfizm, çalışma zamanında belirlenir. Genellikle **virtual** anahtar kelimesi kullanılarak gerçekleştirilir. Bir üst sınıfta tanımlanan bir metot, alt sınıfta geçersiz kılındığında (override) dinamik polimorfizm sağlanır. Bu sayede, bir işaretçi veya referans ile üst sınıf türünden bir nesne kullanıldığında, alt sınıfın geçersiz kılınmış metodu çağrılır.

**Örnek: Dinamik Polimorfizm**

```cpp
#include <iostream>
using namespace std;

class Hayvan {
public:
    virtual void sesCikar() { // Virtual anahtar kelimesi ile tanımlanır
        cout << "Hayvan ses çıkarıyor!" << endl;
    }
};

class Kedi : public Hayvan {
public:
    void sesCikar() override { // Geçersiz kılma
        cout << "Kedi miyavlıyor!" << endl;
    }
};

class Kopek : public Hayvan {
public:
    void sesCikar() override { // Geçersiz kılma
        cout << "Köpek havlıyor!" << endl;
    }
};

void hayvanSesiniCikar(Hayvan* hayvan) {
    hayvan->sesCikar(); // Dinamik olarak çağırılır
}

int main() {
    Kedi kedi;
    Kopek kopek;

    hayvanSesiniCikar(&kedi); // Kedi'nin sesi
    hayvanSesiniCikar(&kopek); // Köpek'in sesi
    return 0;
}
```

#### Polimorfizmin Avantajları

1. **Kodun Yeniden Kullanımı**: Polimorfizm, benzer kodları tekrar kullanarak kodun daha modüler ve bakımı kolay olmasını sağlar.
2. **Esneklik**: Dinamik polimorfizm, çalışma zamanında farklı nesne türlerini işleme yeteneği sunarak kodun esnekliğini artırır.
3. **Bakım Kolaylığı**: Geçersiz kılma (override) ile üst sınıfın metotları altında yeni davranışlar tanımlamak, yazılım bakımını kolaylaştırır.

#### Sonuç

Polimorfizm, C++ dilinde nesne yönelimli programlamanın güçlü özelliklerinden biridir. Statik ve dinamik polimorfizm, yazılımcılara daha esnek ve bakımı kolay kod yazma imkanı sunar.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.yavuzlar.org/egitim/c-plus-plus/3.0-siniflar/3.8-polimorfizm-polymorphism.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
