polymorphism |
---|
ad hoc polymorphism |
parametric polymorphism |
subtyping |
ad hoc polymorphism (tsz. ad hoc polymorphisms)
Az ad hoc polimorfizmus egy olyan polimorfizmus típus, amely lehetővé teszi, hogy ugyanazt a műveletet különböző típusokon alkalmazzuk eltérő módon. C++-ban az ad hoc polimorfizmus két fő formában jelenik meg:
Az ad hoc polimorfizmus nem az öröklésen alapul, hanem azon, hogy ugyanazzal a névvel több különböző implementációt tudunk létrehozni, amelyek különböző típusú paramétereket fogadnak el.
A funkció túlterhelés azt jelenti, hogy ugyanazzal a névvel több függvényt is létrehozhatunk, amelyek eltérő típusú vagy számú paramétert fogadnak el.
#include <iostream>
using namespace std;
// Ugyanaz a függvénynév, de különböző paraméterlisták
void kiir(int a) {
cout << "Egész szám: " << a << endl;
}
void kiir(double a) {
cout << "Lebegőpontos szám: " << a << endl;
}
void kiir(string szoveg) {
cout << "Szöveg: " << szoveg << endl;
}
int main() {
kiir(10);
kiir(3.14);
kiir("Hello, világ!");
return 0;
}
Egész szám: 10 Lebegőpontos szám: 3.14 Szöveg: Hello, világ!
Fontos szabályok funkció túlterhelésnél: - A függvények azonos nevűek kell legyenek. - A paraméterlista különböznie kell (más típusú vagy eltérő számú paraméter). - A visszatérési érték nem elég a megkülönböztetéshez.
Hibás példák:
int osszeg(int a, int b);
double osszeg(int a, int b); // HIBA! Csak a visszatérési érték különbözik!
C++-ban az operátorokat túl lehet terhelni, hogy egyedi működést biztosítsanak saját osztályaink számára.
+
operátor túlterhelése egy Pont
osztályhoz#include <iostream>
using namespace std;
class Pont {
public:
int x, y;
Pont(int a, int b) : x(a), y(b) {}
// Operátor túlterhelése
Pont operator+(const Pont& masik) {
return Pont(x + masik.x, y + masik.y);
}
void kiir() {
cout << "Pont(" << x << ", " << y << ")" << endl;
}
};
int main() {
Pont p1(2, 3), p2(4, 5);
Pont eredmeny = p1 + p2; // Operátor túlterhelés működik!
eredmeny.kiir();
return 0;
}
Pont(6, 8)
Fontos megjegyzések operátor túlterhelésnél: - Az operátorokat csak osztályokhoz lehet túlterhelni. - Nem minden operátor túlterhelhető (pl. .
és ::
nem túlterhelhetők). - Az operator+
, operator-
, operator==
, stb. függvényeket az adott osztályban kell definiálni.
Polimorfizmus típusa | Leírás | Példa |
---|---|---|
Ad hoc polimorfizmus | Azonos nevű függvények, de eltérő paraméterek vagy operátorok túlterhelése | Funkció és operátor túlterhelés |
Szubtípus polimorfizmus (klasszikus OOP) | Egy leszármazott osztály használható az ősosztály helyett | Virtuális függvények és override
|
Paraméteres polimorfizmus | Típusfüggetlen kód sablonokkal | Template függvények és osztályok |
function overloading
): ugyanaz a függvénynév különböző paraméterekkel.operator overloading
): egyedi működést biztosíthatunk saját osztályainkhoz.