Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Virtual- ja Override-avainsanat | Polymorfismin Yleiskatsaus
C++ OOP
course content

Kurssisisältö

C++ OOP

C++ OOP

1. C++:n OOP:n Perusteet
2. Konstruktorit ja Destruktorit
3. Kapseloinnin Yleiskatsaus
4. Perinnän Yleiskatsaus
5. Polymorfismin Yleiskatsaus

book
Virtual- ja Override-avainsanat

Virtual-avainsana

virtual-avainsanaa käytetään ennen metodin määrittelyä class-luokassa ratkaisemaan aiemmin käsitelty ongelma. Sitä käytetään menetelmille, jotka ovat yhteisiä kaikille aliluokille, mutta vaativat erilliset toteutukset jokaiselle. Käytännössä se näyttää tavalliselta metodin määrittelyltä, mutta alkaa sanalla virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Kun funktio määritellään virtual-avainsanalla yliluokassa, se mahdollistaa sen ylikirjoittamisen aliluokassa. Tämä tarkoittaa, että aliluokka voi tarjota oman toteutuksensa, joka kutsutaan alkuperäisen toteutuksen sijaan kun funktiota kutsutaan osoittimen tai viitteen kautta yliluokkaan.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Huomio

Kun käytössä on osoitin olioon ja halutaan päästä käsiksi sen jäseniin osoittimen kautta, käytetään nuoliviittausta (->).

Palatessa alkuperäisen painikeongelman ratkaisuun, tämä menetelmä mahdollistaa yhden funktion luomisen, joka ottaa parametrinaan yliluokan Button-osoittimen. Tämän ansiosta funktiota voidaan kutsua välittämällä sille SubmitButton, ResetButton tai CancelButton, ja se toimii odotetulla tavalla.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Huomio

Yritä luoda olioita eri aliluokista ja välitä ne funktiolle.

Override-avainsana

override-avainsanaa käytetään aliluokassa ilmaisemaan selkeästi, että jäsenfunktio korvaa virtuaalisen funktion yliluokasta. Tämä auttaa havaitsemaan virheet käännösaikana, jos funktion määrittely aliluokassa ei vastaa mitään virtuaalista funktiota yliluokassa.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

Jos tapahtuu virhe, kuten kirjoitusvirhe funktiosignatuurissa tai yliluokassa ei ole funktiota, jota yrität ylikirjoittaa, kääntäjä antaa virheen, mikä auttaa havaitsemaan mahdolliset virheet käännösaikana. Tämä ominaisuus on erityisen hyödyllinen suurissa tiimeissä, joissa muutosten, kuten metodien uudelleennimeämisen, seuraaminen voi olla haastavaa.

question mark

Mikä on virtual-avainsanan päätarkoitus?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

course content

Kurssisisältö

C++ OOP

C++ OOP

1. C++:n OOP:n Perusteet
2. Konstruktorit ja Destruktorit
3. Kapseloinnin Yleiskatsaus
4. Perinnän Yleiskatsaus
5. Polymorfismin Yleiskatsaus

book
Virtual- ja Override-avainsanat

Virtual-avainsana

virtual-avainsanaa käytetään ennen metodin määrittelyä class-luokassa ratkaisemaan aiemmin käsitelty ongelma. Sitä käytetään menetelmille, jotka ovat yhteisiä kaikille aliluokille, mutta vaativat erilliset toteutukset jokaiselle. Käytännössä se näyttää tavalliselta metodin määrittelyltä, mutta alkaa sanalla virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Kun funktio määritellään virtual-avainsanalla yliluokassa, se mahdollistaa sen ylikirjoittamisen aliluokassa. Tämä tarkoittaa, että aliluokka voi tarjota oman toteutuksensa, joka kutsutaan alkuperäisen toteutuksen sijaan kun funktiota kutsutaan osoittimen tai viitteen kautta yliluokkaan.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Huomio

Kun käytössä on osoitin olioon ja halutaan päästä käsiksi sen jäseniin osoittimen kautta, käytetään nuoliviittausta (->).

Palatessa alkuperäisen painikeongelman ratkaisuun, tämä menetelmä mahdollistaa yhden funktion luomisen, joka ottaa parametrinaan yliluokan Button-osoittimen. Tämän ansiosta funktiota voidaan kutsua välittämällä sille SubmitButton, ResetButton tai CancelButton, ja se toimii odotetulla tavalla.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Huomio

Yritä luoda olioita eri aliluokista ja välitä ne funktiolle.

Override-avainsana

override-avainsanaa käytetään aliluokassa ilmaisemaan selkeästi, että jäsenfunktio korvaa virtuaalisen funktion yliluokasta. Tämä auttaa havaitsemaan virheet käännösaikana, jos funktion määrittely aliluokassa ei vastaa mitään virtuaalista funktiota yliluokassa.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

Jos tapahtuu virhe, kuten kirjoitusvirhe funktiosignatuurissa tai yliluokassa ei ole funktiota, jota yrität ylikirjoittaa, kääntäjä antaa virheen, mikä auttaa havaitsemaan mahdolliset virheet käännösaikana. Tämä ominaisuus on erityisen hyödyllinen suurissa tiimeissä, joissa muutosten, kuten metodien uudelleennimeämisen, seuraaminen voi olla haastavaa.

question mark

Mikä on virtual-avainsanan päätarkoitus?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 2
some-alt