C++ run-time polymorphism nasıl kullanılır?

Katılım
18 Aralık 2018
Mesajlar
9.047
Makaleler
14
Çözümler
128
Yer
Dubai
Merhaba;
Ödev için Deque sınıfı yazıyorum. Sınıfı yazmayı bitirdim. Sadece STD içerisinden Deque kullanmamızı istemiyormuş hoca. Tamamen STD üyelerini kullanmamaya gerek yokmuş. Neyse, sonuç itibariyle kullanmadan yazdım. Konuyla ilgili hocama danıştığımda bizden run-time polymorphism istediğini belirtti. Inheritance kullanmadan run-time da bunu yapmak mümkün mü? Yani function overriding yanlış bilmiyorsam, run-time polymorphismin temel mantığı. Parent class'ta bulunan aynı veri tipi ve isimdeki fonksiyonun child class'ta kullanılarak override edilmesi değil mi? Böylece eğer parent class'tan çağırılırsa farklı, child class'tan çağrılırsa farklı çalışmış olacak ancak döndürdüğü veri tipi aynı olacak?
 
Çalışma zamanı polimorfizmi demek sanal fonksiyonlar ve vtable demektir. Base class'taki virtual function'un prototipi neyse Derived class'ta da aynı prototipe sahip olmalı, aksi halde Base class'taki virtual function'u override etmiş olmayız. Bu bağlamda virtual function'un geri dönüş türünü Derived class'ta değiştiremeyiz ancak bunun bir istisnası vardır o da covariant türler, Base class'taki virtual function Base türünde bir işaretçi döndürüyorsa Derived class'ta bu virtual function Derived türünde bir işaretçi döndürebilir, çünkü bunlar covariant türlerdir, bu kullanımda override bozulmaz.

Çalışma zamanında bir polimorfizm örneği, burada Base class'ın bir işaretçisine Derived class'ın bir işaretçisini atıyor ardından base class üzerinden derived class'ın fonksiyonuna erişiyoruz, bu işlem vtable üzerinden gerçekleşiyor.

override specifier'i C+11 ile geldi, eğer eski bir C++ versiyonu kullanıyorsan silebilirsin, bunun faydası derived classtaki fonksiyonun base class ta bir fonksiyonu override edip etmediğini bize söylüyor, derleme hatası vererek.

Sonuç olarak bunu projende nasıl kullanabilirsin aklıma pek işlevsel bir fikir gelmedi açıkçası, hocanız ilginç bir ödev istemiş.

C++:
#include <iostream>

using namespace std;

class Hayvanlar {
    public:
        virtual void  bilgi() {
            cout << "Hayvanlar" << endl;
      }
};

class Timsah : public Hayvanlar {
    public:
    void bilgi() override {
        cout << "ben timsah" << endl;
    }
};

class Aslan : public Hayvanlar {
    public:
    void bilgi() override {
        cout << "ben aslan" << endl;
    }
};


int main() {
    
    Hayvanlar *hayvanListesi[10];

    hayvanListesi[0] = new Aslan;
    hayvanListesi[1] = new Timsah;
    hayvanListesi[2] = new Aslan;
    hayvanListesi[3] = new Timsah;
    hayvanListesi[4] = new Timsah;

    for (size_t i = 0; i < 5; i++)
    {
        hayvanListesi[i]->bilgi();
    }
    
    return 0;
}
 
Çalışma zamanı polimorfizmi demek sanal fonksiyonlar ve vtable demektir. Base class'taki virtual function'un prototipi neyse Derived class'ta da aynı prototipe sahip olmalı, aksi halde Base class'taki virtual function'u override etmiş olmayız. Bu bağlamda virtual function'un geri dönüş türünü Derived class'ta değiştiremeyiz ancak bunun bir istisnası vardır o da covariant türler, Base class'taki virtual function Base türünde bir işaretçi döndürüyorsa Derived class'ta bu virtual function Derived türünde bir işaretçi döndürebilir, çünkü bunlar covariant türlerdir, bu kullanımda override bozulmaz.

Çalışma zamanında bir polimorfizm örneği, burada Base class'ın bir işaretçisine Derived class'ın bir işaretçisini atıyor ardından base class üzerinden derived class'ın fonksiyonuna erişiyoruz, bu işlem vtable üzerinden gerçekleşiyor.

override specifier'i C+11 ile geldi, eğer eski bir C++ versiyonu kullanıyorsan silebilirsin, bunun faydası derived classtaki fonksiyonun base class ta bir fonksiyonu override edip etmediğini bize söylüyor, derleme hatası vererek.

Sonuç olarak bunu projende nasıl kullanabilirsin aklıma pek işlevsel bir fikir gelmedi açıkçası, hocanız ilginç bir ödev istemiş.
Verdiğiniz örnek ve anlatım için teşekkür ederim. Miras olmadan bunu yapmanın bir yolu yok o halde. Şimdi oturup bir daha miras kullanarak yazmam gerekiyor sınıfı. :D Aslında istenen ödev oldukça basitmiş, ben sadece bir cümlesi yüzünden biraz kendime zorlaştırdım. Std ve template ile ilgili danıştığımda "template de kullanmanızı istemiyorum" dedi, haliyle bende hiç bir std üyesi ve template olmadan ve class'ı olabildiğince temiz tutarak yapmak istedim. Böyle olunca mirasa ihtiyaç duymaksızın yazdığım class ortaya çıktı. Temeli @Dynamics siz attınız gerçi.


Şimdi Deque adında bir base, intDeque ve charDeque adında iki derived class oluştursam... Hangi fonksiyonları override edebilirim acaba?
 

Technopat Haberler

Yeni konular

Geri
Yukarı