polymorphism c
Örneklerle C ++ 'da Polimorfizmin Rolü.
Çok biçimlilik, nesne yönelimli programlamanın dört temelinden biridir. Çok biçimlilik, birçok biçime sahip olmak anlamına gelir. Duruma bağlı olarak bir nesnenin birçok şekilde olabileceği teknik olarak tanımlanabilir.
Programlama terimleriyle, bir nesnenin farklı koşullarda farklı davranabileceğini söyleyebiliriz.
Bu eğitimde, polimorfizm türleri, polimorfizmi uygulama yolları ve diğer çeşitli polimorfizm kavramları hakkında ayrıntılı bilgi edineceğiz.
=> Burada C ++ Eğitim Öğreticilerinin A-Z'sini Görmek İçin Burayı Kontrol Edin.
Örneğin, bir kadın farklı durumlarda birçok rol üstlenebilir. Bir çocuğa göre, o bir anne, evde bir ev hanımı, ofiste bir işçi vb. Yani bir kadın farklı roller üstleniyor ve farklı koşullarda farklı davranışlar sergiliyor. Bu gerçek hayattan bir polimorfizm örneğidir.
Benzer şekilde programlama dünyasında da, işlenenler değiştiğinde farklı davranan ikili toplama operatörü olan '+' operatörümüz olabilir. Örneğin, her iki işlenen de sayısal olduğunda toplama yapar.
Öte yandan, işlenenler dizge olduğunda, birleştirme operatörü olarak işlev görür. Dolayısıyla polimorfizm, özetle, birçok formu alan veya farklı koşullar altında farklı davranan bir varlık anlamına gelir.
Ne öğreneceksin:
- Polimorfizm Türleri
- Zaman Polimorfizmi Vs. derleyin. Çalışma Zamanı Polimorfizmi
- Zaman Polimorfizmini Derleyin
- Fonksiyon Aşırı Yüklemesi
- Operatör Aşırı Yüklemesi
- Sonuç
- Önerilen Kaynaklar
Polimorfizm Türleri
Polimorfizm iki türe ayrılır.
- Zaman polimorfizmini derleyin
- Çalışma zamanı polimorfizmi
Bunu temsil eden şema aşağıda gösterilmiştir:
Yukarıdaki diyagramda gösterildiği gibi, polimorfizm, derleme zamanı polimorfizmine ve çalışma zamanı polimorfizmine bölünmüştür. Derleme zamanı polimorfizmi ayrıca operatör aşırı yüklemesi ve işlev aşırı yüklemesi olarak ikiye ayrılır. Çalışma zamanı polimorfizmi, sanal işlevler kullanılarak daha da uygulanır.
Derleme zamanı polimorfizmi, erken bağlanma veya statik polimorfizm olarak da bilinir. Bu tür polimorfizmde, nesnenin yöntemi derleme zamanında çağrılır. Çalışma zamanı polimorfizmi durumunda, nesnenin yöntemi çalışma zamanında çağrılır.
Çalışma zamanı polimorfizmi, dinamik veya geç bağlanma veya dinamik polimorfizm olarak da bilinir. Aşağıdaki konu başlıklarımızda bu tekniklerin her birinin ayrıntılı uygulamasını inceleyeceğiz.
Zaman Polimorfizmi Vs. derleyin. Çalışma Zamanı Polimorfizmi
Derleme zamanı ve çalışma zamanı polimorfizmi arasındaki temel farkları aşağıda görelim.
Zaman polimorfizmini derleyin | Çalışma zamanı polimorfizmi |
---|---|
Statik polimorfizm veya erken bağlanma olarak da bilinir | Dinamik polimorfizm veya geç / dinamik bağlama olarak da bilinir |
Nesneler yöntemi derleme zamanında çağrılır | Nesnenin yöntemi çalışma zamanında çağrılır |
Genellikle operatör aşırı yükleme ve işlev aşırı yükleme kullanılarak uygulanır | Sanal işlevler ve yöntemi geçersiz kılma kullanılarak uygulandı |
Yöntem Aşırı Yükleme, birden fazla yöntemin aynı ada ancak farklı parametre listesi ve türlerine sahip olabileceği bir derleme zamanı polimorfizmidir. | Yöntemi geçersiz kılma, birden fazla yöntemin aynı prototiple aynı ada sahip olduğu çalışma zamanı polimorfizmidir. |
Yöntemler derleme zamanında bilindiğinden, yürütme daha hızlıdır | Yöntem çalışma zamanında bilindiği için yürütme daha yavaştır |
Her şeyin derleme zamanında bilinmesi gerektiğinden çözümleri uygulamak için daha az esneklik sağlayın | Yöntemlere çalışma zamanında karar verildiği için karmaşık çözümleri uygulamak için çok daha esnek |
Zaman Polimorfizmini Derleyin
Derleme zamanı polimorfizmi, bir nesnenin yönteminin derleme zamanında çağrıldığı bir tekniktir.
Bu tür Polimorfizm iki şekilde uygulanır.
- Fonksiyon aşırı yükleme
- Operatör aşırı yükleme
Her tekniği ayrıntılı olarak tartışacağız.
Fonksiyon Aşırı Yüklemesi
Aynı ada, ancak farklı parametre türlerine veya farklı sayıda argümana sahip birden fazla işlevimiz olduğunda, bir işlevin aşırı yüklenmiş olduğu söylenir.
Böylece, parametre türlerine, parametrelerin sırasına ve parametre sayısına bağlı olarak bir fonksiyon aşırı yüklenebilir.
Aynı ada ve aynı parametre listesine sahip ancak farklı dönüş türüne sahip iki işlevin aşırı yüklenmiş bir işlev olmadığını ve programda kullanıldığında bir derleme hatasıyla sonuçlanacağını unutmayın.
Benzer şekilde, işlev parametreleri yalnızca işaretçi açısından farklılık gösterdiğinde ve dizi türü eşdeğerse, aşırı yükleme için kullanılmamalıdır.
Statik ve statik olmayan, sabit ve uçucu vb. Gibi diğer türler veya varsayılan değerlerin varlığı veya yokluğu bakımından farklılık gösteren parametre bildirimleri, uygulama açısından eşdeğer olduklarından aşırı yükleme için de kullanılmaz.
Örneğin,Aşağıdaki fonksiyon prototipleri aşırı yüklenmiş fonksiyonlardır.
Add(int,int); Add(int,float); Add(float,int); Add(int,int,int);
Yukarıdaki prototiplerde, Add fonksiyonunu parametrelerin türüne, parametrelerin sırasına veya sırasına, parametre sayısına vb. Göre aşırı yüklediğimizi görüyoruz.
Fonksiyon Aşırı Yüklemesini daha iyi anlamak için eksiksiz bir programlama Örneği alalım.
#include #include using namespace std; class Summation { public: int Add(int num1,int num2) { return num1+num2; } int Add(int num1,int num2, int num3) { return num1+num2+num3; } string Add(string s1,string s2){ return s1+s2; } }; int main(void) { Summation obj; cout< Çıktı:
35
191
19
Selam Dünya
Yukarıdaki programda, iki tamsayı argümanı, üç tamsayı argümanı ve iki dize argümanı alan Add adında üç aşırı yüklenmiş işlevi tanımlayan bir Toplama sınıfımız var.
Java'da diziler nasıl sıralanır
Ana işlevde, çeşitli parametreleri sağlayan dört işlev çağrısı yapıyoruz. İlk iki işlev çağrısı basittir. Add'e yapılan üçüncü işlev çağrısında, argüman olarak iki kayan nokta değeri sağlıyoruz.
Bu durumda, eşleşen işlev int Add (int, int) olur, çünkü dahili olarak float double türüne dönüştürülür ve ardından int parametreleriyle işlevle eşleştirilir. Float yerine double belirtmiş olsaydık, parametre olarak double ile başka bir aşırı yüklenmiş fonksiyonumuz olurdu.
Son işlev çağrısı, dizi değerlerini parametre olarak kullanır. Bu durumda, Add (+) operatörü bir bitiştirme operatörü olarak işlev görür ve tek bir dize oluşturmak için iki dize değerini birleştirir.
Fonksiyon Aşırı Yüklemenin Faydaları
İşlev aşırı yüklemesinin ana yararı, kodun yeniden kullanılabilirliğini teşvik etmesidir. Argüman türüne, argüman sırasına ve argüman sayısına göre aşırı yüklenmiş oldukları sürece aynı isimde mümkün olduğunca çok fonksiyona sahip olabiliriz.
Bunu yaparak, aynı işlemin farklı koşullarda davranışını temsil etmek için aynı ada sahip farklı işlevlere sahip olmak daha kolay hale gelir.
Eğer fonksiyon aşırı yükleme mevcut olmasaydı, o zaman farklı isimlerle çok fazla farklı türde fonksiyon yazmamız gerekirdi, bu da kodu okunamaz ve uyarlaması zor hale getirirdi.
Operatör Aşırı Yüklemesi
Operatör aşırı yükleme, C ++ 'da mevcut operatörlere farklı bir anlam verdiğimiz tekniktir. Başka bir deyişle, kullanıcı tanımlı veri türlerine nesneler olarak özel bir anlam vermek için operatörleri aşırı yüklüyoruz.
C ++ 'daki çoğu operatör aşırı yüklenmiş veya kullanıcı tanımlı veri türleri üzerinde çalışabilmeleri için özel bir anlam verilmiştir. Aşırı yükleme sırasında, operatörlerin temel işlemlerinin değişmediğini unutmayın. Aşırı yükleme, operatöre temel anlambilimlerini aynı tutarak ek bir anlam verir.
Operatörlerin çoğu C ++ 'da aşırı yüklenebilse de, aşırı yüklenemeyen bazı operatörler vardır.
Bu operatörler aşağıdaki tabloda listelenmiştir.
Operatörler Kapsam çözünürlük operatörü (: :) Boyutu üye seçici (.) üye işaretçi seçici (*) üçlü operatör(?:)
Operatörleri aşırı yüklemek için kullandığımız işlevlere ' Operatör fonksiyonları ”.
Operatör işlevleri normal işlevlere benzer, ancak farklıdır. Aradaki fark, operatör işlevlerinin adının ' Şebeke 'Ve ardından aşırı yüklenecek operatör sembolü.
Operatör işlevi daha sonra programda ilgili operatör kullanıldığında çağrılır. Bu operatör işlevleri, üye işlevler veya genel yöntemler veya hatta bir arkadaş işlevi olabilir.
Operatör işlevinin genel sözdizimi şöyledir:
return_type classname::operator op(parameter list) { //function body }
Burada 'operatör op', operatörün anahtar kelime ve op'nin aşırı yüklenecek operatör olduğu operatör işlevidir. Dönüş_türü, döndürülecek değer türüdür.
Operatör fonksiyonlarını kullanarak operatör aşırı yüklemesini göstermek için birkaç programlama Örneği görelim.
Örnek 1:Üye operatör işlevini kullanarak tekli operatörün aşırı yüklenmesi.
#include using namespace std; class Distance { public: int feet; // Constructor to initialize the object's value Distance(int feet) { this->feet = feet; } //operator function to overload ++ operator to perform increment on Distance obj void operator++() { feet++; } void print(){ cout << '
Incremented Feet value: ' << feet; } }; int main() { Distance d1(9); // Use (++) unary operator ++d1; d1.print(); return 0; }
Çıktı:
Artan Ayak değeri: 10
Burada, operatör ++ fonksiyonunu kullanarak tekli artış operatörünü aşırı yükledik. Ana işlevde, Distance sınıfının nesnesini artırmak için bu ++ operatörünü kullanırız.
Örnek 2:Üye operatör işlevini kullanarak ikili operatörün aşırı yüklenmesi.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //Operator function to overload binary + to add two complex numbers Complex operator + (Complex const &obj) { Complex c3; c3.real = real + obj.real; c3.imag = imag + obj.imag; return c3; } void print() { cout << real << ' + i' << imag << endl; } }; int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Çıktı:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Burada, operatör aşırı yüklemesini kullanarak iki karmaşık sayının eklenmesinin klasik örneğini kullandık. Karmaşık sayıları temsil edecek bir sınıf ve karmaşık sayıların gerçek ve sanal kısımlarını eklediğimiz aşırı yük + operatörü için bir operatör işlevi tanımlarız.
Ana işlevde, iki karmaşık nesne bildiriyoruz ve istenen sonucu elde etmek için aşırı yüklenmiş + operatörünü kullanarak bunları ekliyoruz.
Aşağıdaki örnekte, uygulamadaki farkı görmek için iki karmaşık sayı eklemek için arkadaş işlevini kullanacağız.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //friend function to overload binary + to add two complex numbers friend Complex operator +(Complex const &, Complex const &); void print() { cout << real << ' + i' << imag << endl; } }; Complex operator + (Complex const &c1, Complex const &c2) { Complex c3; c3.real = c1.real + c2.real; c3.imag = c1.imag + c2.imag; return c3; } int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Çıktı:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Programın çıktısının aynı olduğunu görüyoruz. Gerçekleştirmedeki tek fark, önceki uygulamada bir üye işlevi yerine + işlecini aşırı yüklemek için arkadaş işlevinin kullanılmasıdır.
Arkadaş fonksiyonu bir ikili operatör için kullanıldığında, fonksiyonun her iki işlenenini de açıkça belirtmemiz gerekir. Benzer şekilde, tekli operatör arkadaş işlevi kullanılarak aşırı yüklendiğinde, işleve tek işleneni sağlamamız gerekir.
Operatör fonksiyonlarının yanı sıra bir de yazabiliriz dönüştürme operatörü bu, bir türden diğerine dönüştürmek için kullanılır. Bu aşırı yüklenmiş dönüştürme işleçleri, sınıfın bir üye işlevi olmalıdır.
Örnek 3:Dönüştürme operatörü kullanarak operatör aşırı yükleme.
#include using namespace std; class DecFraction { int numerator, denom; public: DecFraction(int num, int denm) { numerator = num; denom = denm; } // conversion operator: converts fraction to float value and returns it operator float() const { return float(numerator) / float(denom); } }; int main() { DecFraction df(3, 5); //object of class float res_val = df; //calls conversion operator cout << 'The resultant value of given fraction (3,5)= '< Çıktı:
Verilen fraksiyonun sonuç değeri (3,5) = 0.6
Bu programda, verilen kesri bir float değerine dönüştürmek için dönüştürme operatörünü kullandık. Dönüştürme işlemi tamamlandığında, dönüştürme operatörü sonuçtaki değeri arayana geri gönderir.
Ana işlevde, df nesnesini bir res_val değişkenine atadığımızda, dönüşüm gerçekleşir ve sonuç res_val'de saklanır.
Tek bir argümana sahip bir kurucu da çağırabiliriz. Tek bir argüman kullanarak sınıftan bir kurucu çağırabildiğimizde, buna ' dönüştürmek inşaatçı ”. Dönüştürme yapıcısı, oluşturulmakta olan sınıfa örtük dönüştürme için kullanılabilir.
#include using namespace std; class Point { private: int x,y; public: Point(int i=0,int j=0) {x = i;y=j;} void print() { cout<<' x = '< Çıktı:
Normal kurucu kullanılarak inşa edilen nokta
x = 20 y = 30
Dönüştürme yapıcısı kullanılarak oluşturulan nokta
x = 10 y = 0
Burada, varsayılan değerlerle bir kurucu tanımlayan bir sınıf Noktamız var. Ana fonksiyonda, x ve y koordinatlarına sahip bir pt nesnesi oluşturuyoruz. Daha sonra, sadece pt'ye 10 değeri atarız. Bu, dönüşüm kurucusunun çağrıldığı ve x'e 10 değerinin atandığı ve y'ye varsayılan değer olan 0'ın verildiği yerdir.
Operatör Aşırı Yükleme Kuralları
Operatör aşırı yükleme yaparken aşağıdaki kurallara dikkat etmemiz gerekir.
- C ++ 'da, yalnızca mevcut operatörleri aşırı yükleyebiliyoruz. Yeni eklenen operatörler aşırı yüklenemez.
- Operatörler aşırı yüklendiğinde, işlenenlerden en az birinin kullanıcı tanımlı tipte olmasını sağlamamız gerekir.
- Belirli operatörleri aşırı yüklemek için arkadaş işlevini de kullanabiliriz.
- Bir üye işlevi kullanarak tekli operatörleri aşırı yüklediğimizde, herhangi bir açık argüman almaz. Tekli operatör arkadaş işlevi kullanılarak aşırı yüklendiğinde açık bir argüman alır.
- Benzer şekilde, üye işlevi kullanılarak ikili operatörler aşırı yüklendiğinde, işleve açık bir argüman sağlamamız gerekir. Arkadaş işlevi kullanılarak ikili operatörler aşırı yüklendiğinde, işlev iki argüman alır.
- C ++ 'da zaten aşırı yüklenmiş iki operatör vardır. Bunlar '=' ve '&' dir. Bu nedenle, aynı sınıftaki bir nesneyi kopyalamak için = operatörünü aşırı yüklememiz gerekmez ve onu doğrudan kullanabiliriz.
Operatör Aşırı Yüklemenin Avantajları
C ++ 'da operatör aşırı yükleme, operatörlerin işlevselliğini yerleşik türlere ek olarak sınıf nesneleri dahil olmak üzere kullanıcı tanımlı türlere genişletmemizi sağlar.
Operatör işlevselliğini kullanıcı tanımlı türlere genişleterek, kullanıcı tanımlı türler üzerinde çeşitli işlemler gerçekleştirmek için karmaşık kodlar yazmamıza gerek kalmaz, ancak bunu yerleşik türlerde olduğu gibi tek bir işlemde yapabiliriz.
Sonuç
Derleme zamanı polimorfizmi, esas olarak kodun işlevselliğini işlev aşırı yüklemesi ve operatör aşırı yüklemesi açısından genişletmek için aşırı yükleme olanağı sağlar.
Fonksiyon aşırı yüklemesi ile aynı isimde ancak farklı parametreler ve türler ile birden fazla fonksiyon yazabiliriz. Bu, kodu basit ve kolay okunabilir hale getirir. Operatörün aşırı yüklenmesi ile operatörlerin işlevselliğini artırabiliriz, böylece kullanıcı tanımlı tipler üzerinde de temel işlemleri yapabiliriz.
Yaklaşan eğitimimizde, C ++ 'da çalışma zamanı polimorfizmi hakkında daha fazla bilgi edineceğiz.
=> Kolay C ++ Eğitim Serisini Okuyun.
Önerilen Kaynaklar
- C ++ 'da Çalışma Zamanı Polimorfizmi
- C ++ 'da Arkadaş İşlevleri
- C ++ 'da Özyineleme
- Uygulamalı Örneklerle Python Ana İşlev Eğitimi
- C ++ 'ya Tam Bir Genel Bakış
- QTP Eğitimi # 21 - Eylemler ve İşlev Kitaplıklarını Kullanarak QTP Testlerini Modüler ve Yeniden Kullanılabilir Yapma
- Unix Borular Eğitimi: Unix Programlamada Borular
- C ++ 'da Kitaplık İşlevleri