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
1234567class 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
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(); }
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
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); }
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
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 3.13
Virtual- og Override-nøgleord
Stryg for at vise menuen
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
1234567class 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
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(); }
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
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); }
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
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.
Tak for dine kommentarer!