Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Introduction to Polymorphism | Polymorfismin Yleiskatsaus
C++ OOP

Introduction to Polymorphism

Pyyhkäise näyttääksesi valikon

Note
Määritelmä

Polymorfismi on keskeinen käsite. Sana tulee kreikasta ja tarkoittaa "monta muotoa"; se mahdollistaa eri classes olioiden käsittelyn yhteisen yliluokan oliona. Merkittävin piirre on, että eri oliot voivat vastata samalla tavalla annettuun viestiin tai metodikutsuun omalla tavallaan.

Polymorfismin tyypit

Polymorfismia on kahta päätyyppiä: kääntöaikainen (staattinen) ja ajoaikainen (dynaaminen). On tärkeää ymmärtää, miten ja milloin kumpaakin käytetään, jotta koodi olisi joustavaa ja tehokasta.

  • Kääntöaikainen polymorfismi: toteutetaan funktioiden tai operaattoreiden ylikuormituksella, jolloin suoritettava metodi määräytyy käännösvaiheessa.

  • Ajoaikainen polymorfismi: käyttää virtuaalifunktioita, jolloin perityt luokat voivat korvata kantaluokan metodeja ja oikea metodi valitaan ajonaikaisesti.

Polymorfismin soveltaminen ja tarve

Hyvä tapa ymmärtää polymorfismia on käyttää esimerkkiä todellisesta maailmasta. Kuvittele graafinen käyttöliittymä, jossa on painike. Tämä painike voi käyttäytyä eri tavoin tilanteesta riippuen—se voi toimia esimerkiksi lähetyspainikkeena, nollauspainikkeena tai peruuta-painikkeena.

Jokainen painike suorittaa erilaisen toiminnon, kun sitä klikataan, mutta kaikki toimivat pohjimmiltaan painikkeina. Tarkastele tämän käsitteen teoreettista toteutusta.

UploadButton.h

UploadButton.h

ResetButton.h

ResetButton.h

CancelButton.h

CancelButton.h

1234
class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } };

Koska kaikilla painikkeilla on sama onClick()-metodi eri toteutuksilla, tarkastellaan asiaa tarkemmin. Entä jos tarvitsemme funktion, joka ottaa olion, joka kuuluu johonkin painikkeen classes, parametrina?

main.cpp

main.cpp

1234567891011
void user_clicked_upload_button(const UploadButton& btn) { btn.onClick(); } void user_clicked_reset_button(const ResetButton& btn) { btn.onClick(); } void user_clicked_cancel_button(const CancelButton& btn) { btn.onClick(); }

Kuten huomaat, erillisten funktioiden luominen jokaiselle painikkeelle lisää monimutkaisuutta, erityisesti muutosten yhteydessä, sillä jokainen funktio on muokattava erikseen, jos ongelmia ilmenee. Lisäksi pääfunktiossa tarvitaan lisätarkistuksia sen määrittämiseksi, mitä funktiota kutsutaan. Polymorfismi mahdollistaa näiden ongelmien helpon ratkaisun.

question mark

Mikä on termin polymorfismi kirjaimellinen merkitys?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 5. Luku 1
some-alt