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 menetelmissä, jotka ovat yhteisiä kaikille aliluokille, mutta vaativat oman toteutuksensa jokaisessa aliluokassa. Käytännössä se muistuttaa tavallista metodin määrittelyä, mutta alkaa sanalla virtual.
Base.h
1234567class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Kun funktio määritellään virtual-avainsanalla yliluokassa, sen voi korvata 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
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(); }
Kun käytössäsi on osoitin objektiin ja haluat päästä käsiksi sen jäseniin osoittimen kautta, käytä nuoliviittausta (->).
Palatessamme alkuperäisen painikeongelman ratkaisuun, tämä menetelmä mahdollistaa yhden funktion luomisen, joka ottaa parametrinaan yliluokan Button-osoittimen. Näin voimme kutsua tätä funktiota välittämällä sille SubmitButton-, ResetButton- tai CancelButton-osoittimen, ja se toimii odotetulla tavalla.
main.cpp
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); }
Yritä luoda erilaisia aliluokkien olioita ja välittää ne funktiolle.
Override-avainsana
override-avainsanaa käytetään aliluokassa ilmaisemaan selkeästi, että jäsenfunktio korvaa yliluokan virtuaalisen funktion. Tämä auttaa havaitsemaan virheet käännösaikana, jos aliluokan funktion allekirjoitus ei vastaa mitään yliluokan virtuaalista funktiota.
main.cpp
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 virheilmoituksen, mikä auttaa havaitsemaan mahdolliset virheet käännösvaiheessa. Tämä ominaisuus on erityisen hyödyllinen suurissa tiimeissä, joissa muutosten, kuten metodin uudelleennimeämisen, seuraaminen voi olla haastavaa.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 3.13
Virtual- ja Override-avainsanat
Pyyhkäise näyttääksesi valikon
Virtual-avainsana
virtual-avainsanaa käytetään ennen metodin määrittelyä class-luokassa ratkaisemaan aiemmin käsitelty ongelma. Sitä käytetään menetelmissä, jotka ovat yhteisiä kaikille aliluokille, mutta vaativat oman toteutuksensa jokaisessa aliluokassa. Käytännössä se muistuttaa tavallista metodin määrittelyä, mutta alkaa sanalla virtual.
Base.h
1234567class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Kun funktio määritellään virtual-avainsanalla yliluokassa, sen voi korvata 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
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(); }
Kun käytössäsi on osoitin objektiin ja haluat päästä käsiksi sen jäseniin osoittimen kautta, käytä nuoliviittausta (->).
Palatessamme alkuperäisen painikeongelman ratkaisuun, tämä menetelmä mahdollistaa yhden funktion luomisen, joka ottaa parametrinaan yliluokan Button-osoittimen. Näin voimme kutsua tätä funktiota välittämällä sille SubmitButton-, ResetButton- tai CancelButton-osoittimen, ja se toimii odotetulla tavalla.
main.cpp
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); }
Yritä luoda erilaisia aliluokkien olioita ja välittää ne funktiolle.
Override-avainsana
override-avainsanaa käytetään aliluokassa ilmaisemaan selkeästi, että jäsenfunktio korvaa yliluokan virtuaalisen funktion. Tämä auttaa havaitsemaan virheet käännösaikana, jos aliluokan funktion allekirjoitus ei vastaa mitään yliluokan virtuaalista funktiota.
main.cpp
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 virheilmoituksen, mikä auttaa havaitsemaan mahdolliset virheet käännösvaiheessa. Tämä ominaisuus on erityisen hyödyllinen suurissa tiimeissä, joissa muutosten, kuten metodin uudelleennimeämisen, seuraaminen voi olla haastavaa.
Kiitos palautteestasi!