Örnek ile C ++ Polimorfizmi

İçindekiler:

Anonim

C ++ 'da Polimorfizm nedir?

C ++ 'da polimorfizm, bir üye işlevin onu çağıran / çağıran nesneye göre farklı davranmasına neden olur. Polimorfizm, birçok biçime sahip olduğu anlamına gelen Yunanca bir kelimedir. Miras yoluyla ilgili bir sınıf hiyerarşisine sahip olduğunuzda oluşur.

Örneğin, makeSound () işlevine sahip olduğumuzu varsayalım. Bir kedi bu işlevi çağırdığında miyav sesi çıkarır. Bir inek aynı işlevi çağırdığında, inek sesi verecektir.

Bir fonksiyonumuz olmasına rağmen, farklı koşullar altında farklı davranır. İşlevin birçok biçimi vardır; dolayısıyla, polimorfizme ulaştık.

Bu C ++ eğitiminde şunları öğreneceksiniz:

  • Polimorfizm nedir?
  • Polimorfizm Türleri
  • Zaman Polimorfizmini Derleyin
  • Fonksiyon Aşırı Yüklemesi
  • Operatör Aşırı Yüklemesi
  • Çalışma Zamanı Polimorfizmi
  • İşlev Geçersiz Kılma
  • C ++ Sanal İşlevi
  • Derleme Zamanı Polimorfizmi Vs. Çalışma Zamanı Polimorfizmi

Polimorfizm Türleri

C ++ iki tür polimorfizmi destekler:

  • Derleme zamanı polimorfizmi ve
  • Çalışma zamanı polimorfizmi.

Zaman Polimorfizmini Derleyin

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, C ++ derleyicisinin derleme zamanında doğru işlevi seçeceği anlamına gelir.

Derleme zamanı polimorfizmi, işlevin aşırı yüklenmesi ve operatörün aşırı yüklenmesi yoluyla elde edilir.

Fonksiyon Aşırı Yüklemesi

Fonksiyon aşırı yüklemesi, 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 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 bir ekran görüntüsü:

Kod Açıklaması:

  1. Iostream başlık dosyasını kodumuza ekleyin. İşlevlerini kullanabileceğiz.
  2. Std ad alanını kodumuza dahil edin. Sınıflarını aramadan kullanabileceğiz.
  3. Tamsayı parametresi i alan test adında bir işlev oluşturun. {, Fonksiyon testinin gövdesinin başlangıcını gösterir.
  4. Yukarıdaki fonksiyon testi çağrılırsa / çağrılırsa yürütülecek ifade.
  5. Yukarıdaki fonksiyon testinin gövdesinin sonu.
  6. Float parametresi f alan test adında bir işlev oluşturun. {, Fonksiyon testinin gövdesinin başlangıcını gösterir.
  7. Yukarıdaki fonksiyon testi çağrılırsa / çağrılırsa yürütülecek ifade.
  8. Yukarıdaki fonksiyon testinin gövdesinin sonu.
  9. Ch karakter parametresi alan test adında bir işlev oluşturun. {, Fonksiyon testinin gövdesinin başlangıcını gösterir.
  10. Yukarıdaki fonksiyon testi çağrılırsa / çağrılırsa yürütülecek ifade.
  11. Yukarıdaki fonksiyon testinin gövdesinin sonu.
  12. Main () işlevini çağırın. {, İşlev gövdesinin başlangıcını gösterir.
  13. Fonksiyon testini çağırın ve argümanın değeri olarak 5'i ona iletin. Bu, bir tamsayı bağımsız değişkenini, yani ilk test işlevini kabul eden test işlevini çağırır.
  14. Fonksiyon testini çağırın ve ona argümanın değeri olarak 5.5 verin. Bu, bir kayan nokta bağımsız değişkenini, yani ikinci test işlevini kabul eden test işlevini çağıracaktır.
  15. Fonksiyon testini çağırın ve argümanın değeri olarak ona beşi iletin. Bu, bir karakter bağımsız değişkenini, yani üçüncü test işlevini kabul eden test işlevini çağıracaktır.
  16. Program başarılı bir şekilde çalışırsa bir değer döndürmelidir.
  17. Main () işlevinin gövdesinin sonu.

Aynı isimde ancak farklı argüman türlerine sahip üç fonksiyonumuz var. Polimorfizme ulaştık.

Operatör Aşırı Yüklemesi

Operator Overloading'de, C ++ operatörü için yeni bir anlam tanımlıyoruz. Ayrıca operatörün çalışma şeklini de değiştirir. Örneğin, iki dizeyi birleştirmek için + operatörünü tanımlayabiliriz. Sayısal değerler eklemek için toplama operatörü olarak biliyoruz. Tanımlamamızdan sonra tamsayılar arasına yerleştirildiğinde onları ekleyecektir. Dizeler arasına yerleştirildiğinde, onları birleştirir.

Örnek 2:

#includeusing 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 bir ekran görüntüsü:

Kod Açıklaması:

  1. İşlevlerini kullanmak için iostream başlık dosyasını programımıza dahil edin.
  2. Sınıflarını çağırmadan kullanmak için std ad alanını programımıza dahil edin.
  3. ComplexNum adlı bir sınıf oluşturun. {, Sınıf gövdesinin başlangıcını gösterir.
  4. Değişkenleri özel olarak işaretlemek için özel erişim değiştiriciyi kullanın, yani bunlara yalnızca sınıf içinden erişilebilir.
  5. Gerçek ve üstü olmak üzere iki tamsayı değişken tanımlayın.
  6. Yapıcıyı genel olarak işaretlemek için genel erişim değiştiricisini kullanın, yani sınıfın dışından bile erişilebilir olacaktır.
  7. Sınıf yapıcısını oluşturun ve değişkenleri başlatın.
  8. Real değişkeninin değerini başlatın.
  9. Üzerinde değişkenin değerini başlatın.
  10. Yapıcı gövdesinin sonu.
  11. + Operatörünün anlamını geçersiz kılmamız gerekiyor.
  12. ComplexNum türünün veri türü sonucunu oluşturun.
  13. Karmaşık sayılarda + 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.
  14. Karmaşık sayılarda + 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.
  15. Program başarılı bir şekilde yürütüldüğünde sonuç değişkeninin değerini döndürecektir.
  16. + İşlecinin yeni anlamının, yani aşırı yükleme tanımının sonu.
  17. Print () yöntemini çağırın.
  18. Konsola ekledikten sonra yeni karmaşık sayıyı yazdırın.
  19. Print () işlevinin gövdesinin sonu.
  20. ComplexNum sınıfının gövdesinin sonu.
  21. Main () işlevini çağırın.
  22. Eklenecek hem gerçek hem de karmaşık parçaların değerlerini iletin. C1'in ilk bölümü c2'nin ilk bölümü olan 10 + 3'e eklenecektir. C1'in ikinci kısmı c'nin ikinci kısmı olan 2 + 7'ye eklenecektir.
  23. Aşırı yüklenmiş + operatörünü kullanarak ve sonucu değişken c3'e depolayarak bir işlem gerçekleştirin.
  24. Konsolda c3 değişkeninin değerini yazdırın.
  25. 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 gerçekleşir. Çalışma zamanı polimorfizmi, işlevin geçersiz kılınmasıyla elde edilir. Çağrılacak / çağrılacak işlev, çalışma süresi sırasında oluşturulur.

İşlev Geçersiz Kılma

Temel sınıfın bir işlevine türetilmiş bir sınıfta yeni bir tanım verildiğinde işlev geçersiz kılma gerçekleşir. O zaman, temel işlevin geçersiz kılındığını söyleyebiliriz.

Örneğin:

#include 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 bir ekran görüntüsü:

Kod Açıklaması:

  1. İşlevlerini kullanmak için iostream başlık dosyasını programımıza aktarın.
  2. Sınıflarını çağırmadan kullanmak için std ad alanını programımıza dahil edin.
  3. Mammal adlı bir sınıf oluşturun. {, Sınıf gövdesinin başlangıcını gösterir.
  4. 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.
  5. Eat adında genel bir işlev oluşturun. {, İşlev gövdesinin başlangıcını gösterir.
  6. Eat () işlevi çağrıldığında cout işlevine eklenen ifadeyi yazdırın.
  7. Fonksiyon gövdesinin sonu yemek ().
  8. Memeli sınıfının gövdesinin sonu.
  9. Mammal sınıfını miras alan Cow adlı bir sınıf oluşturun. İnek türetilmiş sınıftır, Mammal ise temel sınıftır. {Bu sınıfın başlangıcını işaret ediyor.
  10. 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.
  11. Temel sınıfta tanımlanan eat () işlevini geçersiz kılın. {, İşlev gövdesinin başlangıcını gösterir.
  12. Bu işlev çalıştırıldığında konsolda yazdırılacak ifade.
  13. Fonksiyonun gövdesinin sonu eat ().
  14. İnek sınıfının gövdesinin sonu.
  15. Main () işlevini çağırın. {, Bu işlevin gövdesinin başlangıcını gösterir.
  16. Cow sınıfının bir örneğini oluşturun ve ona c adını verin.
  17. Cow sınıfında tanımlanan eat () işlevini çağırın.
  18. Program başarıyla tamamlandığında bir değer döndürmelidir.
  19. Main () işlevinin sonu.

C ++ Sanal İşlevi

Sanal işlev, C ++ 'da çalışma zamanı polimorfizmini uygulamanın başka bir yoludur. Temel sınıfta tanımlanan ve türetilmiş sınıfta yeniden tanımlanan özel bir işlevdir. Bir sanal işlev bildirmek için sanal anahtar sözcüğü kullanmalısınız. Anahtar sözcük, temel sınıftaki işlev bildiriminden önce gelmelidir.

Bir sanal işlev sınıfı miras alınırsa, sanal sınıf, sanal işlevi gereksinimlerine uyacak şekilde yeniden tanımlar. Örneğin:

#include 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 bir ekran görüntüsü:

Kod Açıklaması:

  1. İşlevlerini kullanmak için iostream başlık dosyasını koda ekleyin.
  2. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza dahil edin.
  3. ClassA adlı bir sınıf oluşturun.
  4. Bir sınıf üyesini herkes tarafından erişilebilir olarak işaretlemek için genel erişim değiştiricisini kullanın.
  5. Show () adında bir sanal işlev oluşturun. Kamusal bir işlev olacak.
  6. Show () çağrıldığında yazdırılacak metin. Endl, bitiş çizgisi anlamına gelen bir C ++ anahtar kelimesidir. Fare imlecini bir sonraki satıra taşır.
  7. Sanal işlev gösterisinin gövdesinin sonu ().
  8. ClassA sınıfının gövdesinin sonu.
  9. 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.
  10. Bir sınıf üyesini herkes tarafından erişilebilir olarak işaretlemek için genel erişim değiştiricisini kullanın.
  11. Temel sınıfta türetilen sanal show () işlevini yeniden tanımlayın.
  12. Türetilmiş sınıfta tanımlanan show () işlevi çağrıldığında konsolda yazdırılacak metin.
  13. Show () işlevinin gövdesinin sonu.
  14. Türetilmiş sınıfın gövdesinin sonu, ClassB.
  15. Main () işlevini çağırın. Program mantığı kendi bünyesine eklenmelidir.
  16. A adlı bir işaretçi değişkeni oluşturun. ClassA adlı sınıfa işaret eder.
  17. ClassB adlı sınıfın bir örneğini oluşturun. Örneğe b adı verilir.
  18. A değişkenindeki b adresindeki depo değerlerini atayın.
  19. Türetilmiş sınıfta tanımlanan show () işlevini çağırın. Geç bağlama uygulandı.
  20. 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ğlama 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 süresi boyunca çağrılır / çağrılır
Fonksiyon aşırı yükleme ve operatör aşırı yükleme yoluyla uygulanır Yöntemi geçersiz kılma ve sanal işlevler aracılığıyla uygulanır
Örnek, yöntem aşırı yükleme. Birçok yöntemin benzer adları olabilir, ancak farklı sayıda veya türde argüman olabilir. Örnek, yöntemi geçersiz kılma. Birçok yöntemin benzer bir adı ve aynı prototipi olabilir.
Yöntem keşfi derleme sırasında yapıldığından daha hızlı yürütme Yöntem bulucu çalışma zamanı sırasında yapıldığından daha yavaş yürütme.
Her şey derleme sırasında bilindiği için problem çözme için daha az esneklik sağlanır. Yöntemler çalışma sırasında keşfedildiğinden, karmaşık sorunları çözmek için çok fazla esneklik sağlanmıştır.

Özet:

  • Çok biçimlilik, birçok biçime sahip olmak anlamına gelir.
  • Miras yoluyla ilgili bir sınıf hiyerarşisi olduğunda ortaya çıkar.
  • Çok biçimlilikle, bir işlev onu çağıran / çağıran nesneye göre 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şlev aşırı yüklemesi ve operatör aşırı yüklemesiyle belirlenir.
  • İşlev aşırı yüklemesinde, benzer adlara sahip ancak farklı argümanlara sahip birçok işlev vardır.
  • Parametreler sayı veya tür olarak farklılık gösterebilir.
  • Operatör aşırı yüklemesinde, C ++ operatörleri için yeni bir anlam tanımlanmıştır.
  • Çalışma zamanı polimorfizmi, işlevin geçersiz kılınmasıyla 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.