Kursusindhold
C++ OOP
C++ OOP
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
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
#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
#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
#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!