Ugrás a tartalomhoz

subtype polymorphism

A Wikiszótárból, a nyitott szótárból


Főnév

subtype polymorphism (tsz. subtype polymorphisms)

  1. (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 S alosztálya T-nek, akkor T típusú változók helyettesíthetők S objektumokkal 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

  1. Hiányzik a virtual kulcsszó → nem történik dinamikus diszpécser

  2. Nem használunk referencia vagy pointer típust, hanem érték szerinti átadást:

    void describeAnimal(Animal a); // statikus kötés!
    
  3. 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. ShapeCircle, Rectangle)
  • Játékprogramozás (pl. EntityPlayer, 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.