Bu eğiticide, örnekler yardımıyla C ++ 'daki polimorfizm hakkında bilgi edineceğiz.
Çok biçimlilik, nesne yönelimli programlamanın önemli bir kavramıdır. Basitçe birden fazla form anlamına gelir. Yani aynı varlık (işlev veya operatör) farklı senaryolarda farklı davranır. Örneğin,
+
C ++ Operatör iki özel fonksiyonları gerçekleştirmek için kullanılır. Sayılarla (tamsayılar ve kayan noktalı sayılar) kullanıldığında toplama yapar.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Ve +
operatörü dizelerle kullandığımızda, dizge birleştirme gerçekleştirir. Örneğin,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
C ++ 'da polimorfizmi aşağıdaki yolları kullanarak uygulayabiliriz:
- Fonksiyon aşırı yükleme
- Operatör aşırı yükleme
- İşlev geçersiz kılma
- Sanal işlevler
C ++ İşlev Aşırı Yüklemesi
C ++ 'da, farklı parametrelere sahiplerse (türler veya bağımsız değişken sayısı) aynı ada sahip iki işlevi kullanabiliriz.
Ve argümanların sayısına / türüne bağlı olarak farklı işlevler çağrılır. Örneğin,
// C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )
Çıktı
Toplam 1 = 11 Toplam 2 = 12.1 Toplam 3 = 18
Burada, sum()
farklı parametrelerle (parametre sayısı / türü) 3 farklı fonksiyon oluşturduk . Ve bir işlev çağrısı sırasında iletilen argümanlara göre belirli sum()
bir çağrılır.
Bu bir var derleme zamanı polimorfizmi derleyici programı derlenmiş önce yürütmek için işlev hangi bildiği için.
Daha fazla bilgi edinmek için C ++ İşlev Aşırı Yükleme eğitimimizi ziyaret edin.
C ++ Operatör Aşırı Yüklemesi
C ++ 'da, nesneler veya yapılar gibi kullanıcı tanımlı türler üzerinde çalıştığımız sürece bir operatörü aşırı yükleyebiliriz.
Biz gibi temel türleri için aşırı operatörünü kullanamazsınız int
, double
vb
Operatör aşırı yüklemesi, temelde, farklı operatör işlevlerinin aynı sembole ancak farklı işlenenlere sahip olduğu işlev aşırı yüklemesidir.
Ve işlenenlere bağlı olarak farklı operatör fonksiyonları yürütülür. Örneğin,
// C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )
Çıktı
Sayı: 6
Burada, sınıfın ++
nesneleri Count
(bu durumda nesne sayımı1) üzerinde çalışan operatörü aşırı yükledik.
Bu aşırı yüklenmiş operatörü, count1 nesnesinin değer değişkenini doğrudan artırmak için kullandık 1
.
Bu aynı zamanda bir derleme zamanı polimorfizmidir .
Daha fazla bilgi edinmek için C ++ Operatör Aşırı Yüklemesi eğitimimizi ziyaret edin.
C ++ İşlevini Geçersiz Kılma
C ++ kalıtımında, temel sınıfta ve türetilmiş sınıflarında aynı işleve sahip olabiliriz.
Türetilmiş sınıfın bir nesnesini kullanarak işlevi çağırdığımızda, temel sınıftaki işlev yerine türetilmiş sınıfın işlevi çalıştırılır.
Dolayısıyla, işlevi çağıran nesneye bağlı olarak farklı işlevler yürütülür.
Bu, C ++ ' da işlevi geçersiz kılma olarak bilinir . Örneğin,
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )
Çıktı
Türetilmiş Fonksiyon
Burada, bir kullanmışlardır print()
işlev Base
sınıf ve aynı işlevi Derived
sınıfta
Biz çağrı yaparken print()
kullanarak Derived
nesne derived1, bu geçersiz kılar print()
işlevini Base
yürüterek print()
işlevini Derived
sınıfına.
Bu bir çalışma zamanı polimorfizmidir çünkü işlev çağrısı derleyici tarafından çözülmez, bunun yerine çalışma zamanında çözülür.
Daha fazla bilgi edinmek için C ++ Fonksiyonu Geçersiz Kılma eğitimimizi ziyaret edin.
C ++ Sanal İşlevler
C ++ 'da, türetilmiş sınıfın bir nesnesine işaret etmek için temel sınıfın bir işaretçisini kullanırsak, işlevleri geçersiz kılamayabiliriz.
Kullanımı sanal fonksiyonları taban sınıfı içinde teminat altın fonksiyonu bu durumlarda geçersiz kılınan olabilir.
Bu nedenle, sanal işlevler aslında işlev geçersiz kılma kapsamına girer . Örneğin,
// C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Derived Function
Here, we have used a virtual function
print()
in the Base
class to ensure that it is overridden by the function in the Derived
class.
Virtual functions are runtime polymorphism.
To learn more, visit our C++ Virtual Functions tutorial.
Why Polymorphism?
Polymorphism allows us to create consistent code. For example,
Suppose we need to calculate the area of a circle and a square. To do so, we can create a
Shape
class and derive two classes Circle
and Square
from it.
In this case, it makes sense to create a function having the same name
calculateArea()
in both the derived classes rather than creating functions with different names, thus making our code more consistent.