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øgleord | Oversigt Over Polymorfi
C++ OOP
course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Virtual- og Override-nøgleord

Virtual-nøgleord

Nøgleordet virtual bruges før en metodeerklæring i en class for at løse det problem, vi diskuterede tidligere. Det anvendes til metoder, der er fælles for alle underklasser, men kræver forskellige implementeringer for hver. Grundlæggende ligner det enhver anden metodeerklæring, bortset fra at den begynder 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 funktion erklæres som virtual i en superklasse, gør det det muligt at overskrive den i en underklasse. Det betyder, at underklassen kan levere sin egen implementering, som vil blive kaldt i stedet for den oprindelige implementering, når funktionen kaldes gennem en pointer eller reference 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
Bemærk

Når du har en pointer til et objekt og ønsker at tilgå dets medlemmer gennem pointeren, anvendes pil-operatoren (->).

Ved at vende tilbage til løsningen på det oprindelige problem med knapper, gør denne metode det nemt at oprette én enkelt funktion, der tager en parent Button-pointer som parameter. Dermed kan vi kalde denne funktion ved at videregive en SubmitButton, ResetButton eller CancelButton, og den vil opføre sig 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
Bemærk

Prøv at oprette objekter af forskellige underklasser og videregiv dem til funktionen.

Override-nøgleordet

Nøgleordet override bruges i en underklasse til eksplicit at angive, at en medlemsfunktion overskriver en virtuel funktion fra en superklasse. Det hjælper med at fange fejl under kompilering, hvis funktionssignaturen i underklassen ikke matcher nogen virtuel funktion 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 der opstår en fejl, såsom en tastefejl i funktionssignaturen eller superklassen ikke har den funktion, du forsøger at overskrive, vil compileren generere en fejl, hvilket hjælper med at fange potentielle bugs under kompilering. Denne funktion er især nyttig i store teammiljøer, hvor det kan være udfordrende at holde styr på ændringer som f.eks. omdøbning af metoder.

question mark

Hvad er hovedformålet med nøgleordet virtual?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 2

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Virtual- og Override-nøgleord

Virtual-nøgleord

Nøgleordet virtual bruges før en metodeerklæring i en class for at løse det problem, vi diskuterede tidligere. Det anvendes til metoder, der er fælles for alle underklasser, men kræver forskellige implementeringer for hver. Grundlæggende ligner det enhver anden metodeerklæring, bortset fra at den begynder 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 funktion erklæres som virtual i en superklasse, gør det det muligt at overskrive den i en underklasse. Det betyder, at underklassen kan levere sin egen implementering, som vil blive kaldt i stedet for den oprindelige implementering, når funktionen kaldes gennem en pointer eller reference 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
Bemærk

Når du har en pointer til et objekt og ønsker at tilgå dets medlemmer gennem pointeren, anvendes pil-operatoren (->).

Ved at vende tilbage til løsningen på det oprindelige problem med knapper, gør denne metode det nemt at oprette én enkelt funktion, der tager en parent Button-pointer som parameter. Dermed kan vi kalde denne funktion ved at videregive en SubmitButton, ResetButton eller CancelButton, og den vil opføre sig 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
Bemærk

Prøv at oprette objekter af forskellige underklasser og videregiv dem til funktionen.

Override-nøgleordet

Nøgleordet override bruges i en underklasse til eksplicit at angive, at en medlemsfunktion overskriver en virtuel funktion fra en superklasse. Det hjælper med at fange fejl under kompilering, hvis funktionssignaturen i underklassen ikke matcher nogen virtuel funktion 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 der opstår en fejl, såsom en tastefejl i funktionssignaturen eller superklassen ikke har den funktion, du forsøger at overskrive, vil compileren generere en fejl, hvilket hjælper med at fange potentielle bugs under kompilering. Denne funktion er især nyttig i store teammiljøer, hvor det kan være udfordrende at holde styr på ændringer som f.eks. omdøbning af metoder.

question mark

Hvad er hovedformålet med nøgleordet virtual?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 2
some-alt