subtype polymorphism
| polymorphism |
|---|
| ad hoc polymorphism |
| parametric polymorphism |
| subtyping |
Főnév
subtype polymorphism (tsz. subtype polymorphisms)
- (informatika) Subtype polymorphism (al-típusú polimorfizmus), más néven runtime polymorphism vagy inclusion polymorphism, az objektum-orientált programozás egyik legfontosabb alappillére. Ez azt jelenti, hogy egy ősosztály típusú változó olyan objektumot is képes referálni, amely egy leszármazott osztály példánya. A viselkedés ilyenkor futásidőben dől el a tényleges objektum típusa alapján.
🧠 Röviden: Mi az a subtype polymorphism?
Egy alosztály (gyerekosztály) példánya helyettesíthető az ősosztály típusával úgy, hogy a viselkedés (pl. virtuális függvényhívás) a valódi típustól függ.
🧱 C++ példa:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void makeSound() const {
cout << "Some generic animal sound" << endl;
}
};
class Dog : public Animal {
public:
void makeSound() const override {
cout << "Woof!" << endl;
}
};
void describeAnimal(const Animal& a) {
a.makeSound(); // dinamikus diszpécser
}
int main() {
Dog d;
describeAnimal(d); // "Woof!" -> a valódi típus dönt
}
🔍 Kulcs: Az Animal osztály virtuális függvénye lehetővé teszi, hogy a Dog saját makeSound implementációja fusson le.
📦 Működés kulcsa: Virtuális függvények + öröklődés
Előfeltételek:
- Öröklési hierarchia
- Legalább egy virtuális metódus
- Az alosztály felüldefiniálja ezt
🧠 Virtuális függvény (C++)
class Base {
public:
virtual void f(); // virtual: kulcsszó a dinamikus kötéshez
};
Ha nem virtuális, akkor a függvény statikusan kötődik (fordításkor dönt a fordító), azaz nincs polimorfizmus.
🧬 Liskov-helyettesítési elv (LSP)
A subtype polymorphism egyik elve:
Ha
SalosztályaT-nek, akkorTtípusú változók helyettesíthetőkSobjektumokkal anélkül, hogy a program helytelenül viselkedne.
⚖️ Statikus vs. Dinamikus polimorfizmus
| Tulajdonság | Statikus (compile-time) | Dinamikus (runtime / subtype) |
|---|---|---|
| Polimorfizmus típusa | pl. függvény-sablonok | alosztály-példányokon alapul |
| Döntés ideje | Fordítási idő | Futásidő |
| Mechanizmus | Overload / template | Öröklés + virtuális függvény |
| Futásidői költség | Nincs | Van (vtable lookup) |
⚠️ Gyakori hibák
Hiányzik a
virtualkulcsszó → nem történik dinamikus diszpécserNem használunk referencia vagy pointer típust, hanem érték szerinti átadást:
void describeAnimal(Animal a); // statikus kötés!
Hiányzik virtuális destruktor:
class Base { public: virtual ~Base(); // fontos a helyes felszabadításhoz! };
🔧 Használat gyakorlati példákban
- GUI rendszerek (pl.
Shape→Circle,Rectangle) - Játékprogramozás (pl.
Entity→Player,Enemy) - Plugin architektúrák
- Design minták, pl. Strategy, Observer, Factory
TL;DR
- A subtype polymorphism lehetővé teszi, hogy egy alosztály példányát ősosztály típusúként kezeljük.
- A viselkedés a valódi objektumtípustól függ – futásidőben dől el.
- C++-ban ez virtuális függvényekkel és referencia/pointer típusokkal érhető el.
- Ez az objektum-orientált tervezés egyik legalapvetőbb és legfontosabb fogalma.
- subtype polymorphism - Szótár.net (en-hu)
- subtype polymorphism - Sztaki (en-hu)
- subtype polymorphism - Merriam–Webster
- subtype polymorphism - Cambridge
- subtype polymorphism - WordNet
- subtype polymorphism - Яндекс (en-ru)
- subtype polymorphism - Google (en-hu)
- subtype polymorphism - Wikidata
- subtype polymorphism - Wikipédia (angol)