C++ Örnekle Polimorfizm
Polimorfizm Nedir? C++?
In C++, polimorfizm bir üye işlevin onu çağıran/çağıran nesneye bağlı olarak farklı davranmasına neden olur. Polimorfizm, birçok biçime sahip olmak anlamına gelen Yunanca bir kelimedir. Kalıtım yoluyla ilişkili bir sınıf hiyerarşisine sahip olduğunuzda ortaya çıkar.
Örneğin makeSound() fonksiyonuna sahip olduğumuzu varsayalım. Bir kedi bu işlevi çağırdığında miyav sesi çıkarır. Bir inek aynı işlevi çalıştırdığında, moow sesini çıkaracaktır.
Tek bir işlevimiz olmasına rağmen, farklı koşullar altında farklı davranır. Fonksiyonun birçok biçimi vardır; dolayısıyla polimorfizme ulaştık.
Polimorfizm Türleri
C++ iki tür polimorfizmi destekler:
- Derleme zamanı polimorfizmi ve
- Çalışma zamanı polimorfizmi.
Derleme Zamanı Polimorfizmi
Bağımsız değişkenlerin sayısını ve türünü eşleştirerek aşırı yüklenmiş işlevleri çağırırsınız. Bilgi derleme sırasında mevcuttur. Bu şu anlama gelir: C++ derleyici derleme zamanında doğru işlevi seçecektir.
Derleme zamanı polimorfizmi, işlevin aşırı yüklenmesi ve operatörün aşırı yüklenmesi yoluyla elde edilir.
İşlev Aşırı Yüklemesi
Fonksiyon aşırı yüklenmesi, benzer adlara ancak farklı argümanlara sahip birçok fonksiyonumuz olduğunda meydana gelir. Argümanlar sayı veya tür açısından farklılık gösterebilir.
Örnek 1
#include <iostream> using namespace std; void test(int i) { cout << " The int is " << i << endl; } void test(double f) { cout << " The float is " << f << endl; } void test(char const *ch) { cout << " The char* is " << ch << endl; } int main() { test(5); test(5.5); test("five"); return 0; }
Çıktı:
İşte kodun ekran görüntüsü:
Kod Açıklaması:
- iostream başlık dosyasını kodumuza ekleyin. Fonksiyonlarını kullanabileceğiz.
- Kodumuza std ad alanını ekleyin. Sınıflarını çağırmadan kullanabileceğiz.
- i tamsayı parametresini alan test adında bir işlev oluşturun. {, işlev testi gövdesinin başlangıcını işaret eder.
- Yukarıdaki fonksiyon testi çağrılırsa/çağrılırsa yürütülecek ifade.
- Yukarıdaki fonksiyon testinin gövdesinin sonu.
- Float parametresi f'yi alan test adında bir işlev oluşturun. {, işlev testi gövdesinin başlangıcını işaret eder.
- Yukarıdaki fonksiyon testi çağrılırsa/çağrılırsa yürütülecek ifade.
- Yukarıdaki fonksiyon testinin gövdesinin sonu.
- Ch karakter parametresini alan test adında bir işlev oluşturun. {, işlev testi gövdesinin başlangıcını işaret eder.
- Yukarıdaki fonksiyon testi çağrılırsa/çağrılırsa yürütülecek ifade.
- Yukarıdaki fonksiyon testinin gövdesinin sonu.
- Main() işlevini çağırın. { işlevin gövdesinin başlangıcını belirtir.
- Fonksiyon testini çağırın ve argümanın değeri olarak ona 5'i iletin. Bu, bir tamsayı argümanını kabul eden test fonksiyonunu, yani ilk test fonksiyonunu çağırır.
- Fonksiyon testini çağırın ve argümanın değeri olarak ona 5.5'i iletin. Bu, kayan argümanı kabul eden test fonksiyonunu, yani ikinci test fonksiyonunu çağıracaktır.
- Fonksiyon testini çağırın ve ona argümanın değeri olarak beşi iletin. Bu, bir karakter argümanını kabul eden test fonksiyonunu, yani üçüncü test fonksiyonunu çağıracaktır.
- Program başarılı bir şekilde çalışıyorsa bir değer döndürmelidir.
- main() fonksiyonunun gövdesinin sonu.
Aynı ada sahip ancak farklı türde argümanlara sahip üç fonksiyonumuz var. Polimorfizme ulaştık.
OperaTor Aşırı Yükleniyor
In OperaTor Aşırı Yükleme, için yeni bir anlam tanımlıyoruz. C++ işleci. Ayrıca işlecin çalışma şeklini de değiştirir. Örneğin, iki dizeyi birleştirmek için + işlecini tanımlayabiliriz. Bunu sayısal değerleri toplamak için kullanılan toplama işleci olarak biliyoruz. Tanımımızdan sonra, tamsayılar arasına yerleştirildiğinde bunları toplayacaktır. Dizelerin arasına yerleştirildiğinde bunları birleştirecektir.
Örnek 2
#include<iostream> using namespace std; class ComplexNum { private: int real, over; public: ComplexNum(int rl = 0, int ov = 0) { real = rl; over = ov; } ComplexNum operator + (ComplexNum const &obj) { ComplexNum result; result.real = real + obj.real; result.over = over + obj.over; return result; } void print() { cout << real << " + i" << over << endl; } }; int main() { ComplexNum c1(10, 2), c2(3, 7); ComplexNum c3 = c1+c2; c3.print(); }
Çıktı:
İşte kodun ekran görüntüsü:
Kod Açıklaması:
- Fonksiyonlarını kullanabilmek için iostream başlık dosyasını programımıza ekleyiniz.
- Sınıflarını çağırmadan kullanabilmek için std ad alanını programımıza ekleyin.
- ComplexNum adında bir sınıf oluşturun. { işareti sınıf gövdesinin başlangıcını işaretler.
- Değişkenleri özel olarak işaretlemek için özel erişim değiştiricisini kullanın; bu, onlara yalnızca sınıf içinden erişilebileceği anlamına gelir.
- Gerçek ve üzeri olmak üzere iki tamsayı değişkeni tanımlayın.
- Yapıcıyı genel olarak işaretlemek için genel erişim değiştiricisini kullanın; bu, yapının dışarıdan bile erişilebilir olacağı anlamına gelir. sınıf.
- Sınıf yapıcısını oluşturun ve değişkenleri başlatın.
- Gerçek değişkenin değerini başlat.
- Değişkenin değerini sıfırlayın.
- Yapıcı gövdesinin sonu.
- + operatörünün anlamını geçersiz kılmamız gerekiyor.
- ComplexNum türündeki result veri türünü oluşturun.
- Karmaşık sayılarla + operatörünü kullanın. Bu satır bir sayının gerçek kısmını başka bir sayının gerçek kısmına ekleyecektir.
- Karmaşık sayılarla + operatörünü kullanın. Bu satır bir sayının sanal kısmını başka bir sayının sanal kısmına ekleyecektir.
- Program başarılı bir şekilde yürütüldüğünde değişken sonucunun değerini döndürecektir.
- + operatörünün yeni anlamı yani aşırı yükleme tanımının sonu.
- print() yöntemini çağırın.
- Konsolda toplama işleminden sonra yeni karmaşık sayıyı yazdır.
- print() fonksiyonunun gövdesinin sonu.
- ComplexNum sınıfının gövdesinin sonu.
- Main() işlevini çağırın.
- Eklenecek hem gerçek hem de karmaşık kısımların değerlerini geçirin. c1'in ilk kısmı c2'nin ilk kısmına eklenecektir, yani 10+3. c1'in ikinci kısmı c'nin ikinci kısmına eklenecektir, yani 2+7.
- Aşırı yüklenmiş + operatörünü kullanarak ve sonucu c3 değişkeninde saklayarak bir işlem gerçekleştirin.
- c3 değişkeninin değerini konsola yazdırın.
- main() işlevinin gövdesinin sonu.
Çalışma Zamanı Polimorfizmi
Bu, bir nesnenin yöntemi derleme zamanı yerine çalışma zamanı sırasında çağrıldığında/çağrıldığında meydana gelir. Çalışma zamanı polimorfizmi, işlevin geçersiz kılınması yoluyla elde edilir. Çağrılacak/çağırılacak işlev çalışma zamanı sırasında oluşturulur.
İşlev Geçersiz Kılma
Fonksiyon geçersiz kılma, temel sınıfın bir fonksiyonuna türetilmiş bir sınıfta yeni bir tanım verildiğinde meydana gelir. O zaman temel fonksiyonun geçersiz kılındığını söyleyebiliriz.
Örneğin:
#include <iostream> using namespace std; class Mammal { public: void eat() { cout << "Mammals eat..."; } }; class Cow: public Mammal { public: void eat() { cout << "Cows eat grass..."; } }; int main(void) { Cow c = Cow(); c.eat(); return 0; }
Çıktı:
İşte kodun ekran görüntüsü:
Kod Açıklaması:
- İşlevlerini kullanmak için iostream başlık dosyasını programımıza aktarın.
- Sınıflarını çağırmadan kullanabilmek için std ad alanını programımıza ekleyin.
- Memeli adında bir sınıf oluşturun. {, sınıf gövdesinin başlangıcını işaret eder.
- Oluşturmak üzere olduğumuz işlevi herkese açık olarak ayarlamak için genel erişim değiştiricisini kullanın. Bu sınıfın dışından erişilebilir olacaktır.
- Eat adında genel bir işlev oluşturun. {, işlev gövdesinin başlangıcını işaret eder.
- Eat() işlevi çağrıldığında cout işlevine eklenen ifadeyi yazdırın.
- Eat() fonksiyonunun gövdesinin sonu.
- Memeli sınıfının gövdesinin sonu.
- Memeli sınıfını miras alan Cow adında bir sınıf oluşturun. Cow türetilmiş sınıftır, Mammal ise temel sınıftır. { bu sınıfın başlangıcını işaret eder.
- Oluşturmak üzere olduğumuz işlevi herkese açık olarak işaretlemek için genel erişim değiştiricisini kullanın. Bu sınıfın dışından erişilebilir olacaktır.
- Temel sınıfta tanımlanan eat() fonksiyonunu geçersiz kılın. {, işlev gövdesinin başlangıcını işaret eder.
- Bu işlev çağrıldığında konsolda yazdırılacak ifade.
- Eat() fonksiyonunun gövdesinin sonu.
- İnek sınıfının gövdesinin sonu.
- Main() işlevini çağırın. {, bu fonksiyonun gövdesinin başlangıcını işaret eder.
- Cow sınıfının bir örneğini oluşturun ve ona c adını verin.
- Cow sınıfında tanımlanan eat() işlevini çağırın.
- Program başarılı bir şekilde tamamlandığında bir değer döndürmelidir.
- Main() fonksiyonunun sonu.
C++ Sanal İşlev
Sanal işlev, çalışma zamanı polimorfizmini uygulamanın başka bir yoludur. C++. Temel sınıfta tanımlanan ve türetilmiş sınıfta yeniden tanımlanan özel bir fonksiyondur. Sanal bir işlev bildirmek için sanal anahtar kelimeyi kullanmalısınız. Anahtar kelime, temel sınıftaki işlevin bildiriminden önce gelmelidir.
Bir sanal işlev sınıfı miras alınırsa sanal sınıf, sanal işlevi kendi ihtiyaçlarına uyacak şekilde yeniden tanımlar. Örneğin:
#include <iostream> using namespace std; class ClassA { public: virtual void show() { cout << "The show() function in base class invoked..." << endl; } }; class ClassB :public ClassA { public: void show() { cout << "The show() function in derived class invoked..."; } }; int main() { ClassA* a; ClassB b; a = &b; a->show(); }
Çıktı:
İşte kodun ekran görüntüsü:
Kod Açıklaması:
- İşlevlerini kullanmak için iostream başlık dosyasını koda ekleyin.
- Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
- ClassA adında bir sınıf oluşturun.
- Bir sınıf üyesini genel olarak erişilebilir olarak işaretlemek için genel erişim değiştiricisini kullanın.
- show() adında bir sanal işlev oluşturun. Kamuya açık bir etkinlik olacak.
- show() çağrıldığında yazdırılacak metin çağrılır. Sonu bir C++ bitiş çizgisi anlamına gelen anahtar kelime. Fare imlecini bir sonraki satıra taşır.
- Show() sanal fonksiyonunun gövdesinin sonu.
- ClassA sınıfının gövdesinin sonu.
- ClassA sınıfını miras alan ClassB adında yeni bir sınıf oluşturma. ClassA temel sınıf olurken ClassB türetilmiş sınıf olur.
- Bir sınıf üyesini genel olarak erişilebilir olarak işaretlemek için genel erişim değiştiricisini kullanın.
- Temel sınıfta türetilen show() sanal işlevini yeniden tanımlayın.
- Türetilmiş sınıfta tanımlanan show() işlevi çağrıldığında konsolda yazdırılacak metin.
- show() fonksiyonunun gövdesinin sonu.
- Türetilmiş sınıfın gövdesinin sonu, ClassB.
- Main() işlevini çağırın. Program mantığı kendi bünyesinde eklenmelidir.
- a adında bir işaretçi değişkeni oluşturun. ClassA isimli sınıfa işaret eder.
- ClassB adlı sınıfın bir örneğini oluşturun. Örneğe b adı verilir.
- b adresindeki değer depolarını a değişkenine atayın.
- Türetilmiş sınıfta tanımlanan show() işlevini çağırın. Geç bağlama uygulandı.
- Main() işlevinin gövdesinin sonu.
Derleme Zamanı Polimorfizmi Vs. Çalışma Zamanı Polimorfizmi
İşte ikisi arasındaki temel farklar:
Derleme zamanı polimorfizmi | Çalışma zamanı polimorfizmi |
---|---|
Aynı zamanda erken bağlanma veya statik polimorfizm olarak da adlandırılır | Aynı zamanda geç/dinamik bağlanma veya dinamik polimorfizm olarak da adlandırılır. |
Yöntem derleme sırasında çağrılır/çağırılır | Yöntem çalışma zamanı sırasında çağrılır/çağırılır |
İşlev aşırı yüklemesi ve operatör aşırı yüklemesi yoluyla uygulanır | Yöntem geçersiz kılma ve sanal işlevler aracılığıyla uygulanır |
Örnek, yöntemin aşırı yüklenmesi. Birçok yöntemin benzer adları olabilir ancak farklı sayı veya türde argümanları olabilir. | Örnek, yöntem geçersiz kılma. Birçok yöntemin benzer adı ve aynı prototipi olabilir. |
Yöntem keşfi derleme zamanı sırasında yapıldığından daha hızlı yürütme | Yöntem keşfi çalışma zamanı sırasında yapıldığından daha yavaş yürütme. |
Less Derleme süresi boyunca her şey bilindiği için problem çözmede esneklik sağlanır. | Yöntemler çalışma zamanında keşfedildiğinden karmaşık problemlerin çözümünde büyük esneklik sağlanır. |
ÖZET
- Çok biçimlilik, birçok biçime sahip olmak anlamına gelir.
- Kalıtım yoluyla ilişkili bir sınıf hiyerarşisi olduğunda ortaya çıkar.
- Polimorfizmde bir işlev, onu çağıran/çağıran nesneye bağlı olarak farklı davranabilir.
- Derleme zamanı polimorfizminde çağrılacak işlev derleme zamanı sırasında oluşturulur.
- Çalışma zamanı polimorfizminde çağrılacak işlev çalışma zamanı sırasında oluşturulur.
- Derleme zamanı polimorfizmi, işlevin aşırı yüklenmesi ve operatörün aşırı yüklenmesi yoluyla belirlenir.
- İşlev aşırı yüklemesinde, benzer adlara sahip ancak farklı argümanlara sahip birçok işlev vardır.
- Parametrelerin sayısı veya türü farklı olabilir.
- Operatör aşırı yüklemesinde yeni bir anlam tanımlanmıştır. C++ operatörler.
- Çalışma zamanı polimorfizmi, işlevin geçersiz kılınması yoluyla elde edilir.
- İşlev geçersiz kılmada, türetilmiş bir sınıf, temel sınıfta tanımlanan bir işleve yeni bir tanım verir.