Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Virtual- og Override-nøkkelord | Oversikt over Polymorfisme
C++ OOP
course content

Kursinnhold

C++ OOP

C++ OOP

1. Grunnleggende om OOP i C++
2. Konstruktører og Destruktører
3. Oversikt Over Innkapsling
4. Oversikt over Arv
5. Oversikt over Polymorfisme

book
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

Base.h

copy
1234567
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

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
Merk

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

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
Merk

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

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() { }

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.

question mark

Hva er hovedformålet med nøkkelordet virtual?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

course content

Kursinnhold

C++ OOP

C++ OOP

1. Grunnleggende om OOP i C++
2. Konstruktører og Destruktører
3. Oversikt Over Innkapsling
4. Oversikt over Arv
5. Oversikt over Polymorfisme

book
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

Base.h

copy
1234567
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

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
Merk

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

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
Merk

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

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() { }

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.

question mark

Hva er hovedformålet med nøkkelordet virtual?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 2
some-alt