Kursinnehåll
C++ OOP
C++ OOP
Virtual- och Override-nyckelord
Virtual-nyckelord
Nyckelordet virtual
används före en metoddeklaration i en class
för att lösa det problem som diskuterades tidigare. Det används för metoder som är gemensamma för alla subklasser men kräver unika implementationer för varje. I princip ser det ut som vilken annan metoddeklaration som helst, förutom att den inleds med virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
När en funktion deklareras som virtual
i en superklass, möjliggör det att den kan överskuggas i en subklass. Detta innebär att subklassen kan tillhandahålla en egen implementation, som kommer att anropas istället för den ursprungliga implementationen när funktionen anropas via en pekare eller referens till 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 pekare till ett objekt och vill komma åt dess medlemmar via pekaren, använder du piloperatorn (->
).
Genom att återgå till lösningen för det ursprungliga problemet med knappar, möjliggör denna metod att enkelt skapa en enda funktion som tar en förälder Button
-pekare som parameter. Därmed kan vi anropa denna funktion genom att skicka in en SubmitButton
, ResetButton
eller CancelButton
, och den kommer att fungera som avsett.
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); }
Försök att skapa objekt av olika subklasser och skicka dem till funktionen.
Override-nyckelordet
Nyckelordet override
används i en subklass för att tydligt ange att en medlemsfunktion överskuggar en virtuell funktion från en superklass. Det hjälper till att fånga fel vid kompilering om funktionssignaturen i subklassen inte matchar någon virtuell 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() { }
Om det finns ett misstag, såsom ett stavfel i funktionssignaturen eller om superklassen inte har den funktion du försöker åsidosätta, kommer kompilatorn att generera ett fel, vilket hjälper till att fånga potentiella buggar vid kompilering. Denna funktion är särskilt användbar i stora teammiljöer där det kan vara utmanande att hålla reda på ändringar som metodnamnbyten.
Tack för dina kommentarer!