Kursinnhold
C++ OOP
C++ OOP
Virtual- og Override-nøkkelord
Virtual-nøkkelord
Nøkkelordet virtual
brukes foran en metodedeklarasjon i en class
for å løse problemet vi diskuterte tidligere. Det benyttes for metoder som er felles for alle subklasser, men krever ulike implementasjoner for hver. I praksis ser det ut som enhver annen metodedeklarasjon, bortsett fra at den begynner med virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Når en funksjon deklareres som virtual
i en superklasse, gjør det det mulig å overstyre den i en subklasse. Dette betyr at subklassen kan gi sin egen implementasjon, som vil bli brukt i stedet for den opprinnelige implementasjonen når funksjonen kalles gjennom en peker eller referanse til superklassen.
main.cpp
#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(); }
Når du har en peker til et objekt og ønsker å få tilgang til medlemmene gjennom pekeren, bruker du piloperatoren (->
).
Ved å vende tilbake til løsningen på det opprinnelige problemet med knapper, gjør denne metoden det enkelt å lage én enkelt funksjon som tar en foreldret Button
-peker som parameter. Dermed kan vi kalle denne funksjonen ved å sende inn en SubmitButton
, ResetButton
eller CancelButton
, og den vil oppføre seg som forventet.
main.cpp
#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); }
Prøv å opprette objekter av ulike subklasser og send dem til funksjonen.
Override-nøkkelordet
Nøkkelordet override
brukes i en subklasse for å tydelig angi at en medlemsfunksjon overstyrer en virtuell funksjon fra en superklasse. Dette hjelper med å oppdage feil under kompilering hvis funksjonssignaturen i subklassen ikke samsvarer med noen virtuell funksjon i superklassen.
main.cpp
#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() { }
Hvis det oppstår en feil, for eksempel en skrivefeil i funksjonssignaturen eller superklassen ikke har funksjonen du prøver å overstyre, vil kompilatoren generere en feil, noe som hjelper med å fange potensielle feil under kompilering. Denne funksjonen er spesielt nyttig i store teammiljøer, hvor det kan være utfordrende å holde oversikt over endringer som metodenavnendringer.
Takk for tilbakemeldingene dine!