Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Virtual- och Override-nyckelord | Översikt av Polymorfism
C++ OOP
course content

Kursinnehåll

C++ OOP

C++ OOP

1. Grunderna i OOP i C++
2. Konstruktorer och Destruktorer
3. Översikt Av Inkapsling
4. Översikt av Arv
5. Översikt av Polymorfism

book
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

Base.h

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

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
Notering

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

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
Notera

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

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

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.

question mark

Vad är huvudsyftet med nyckelordet virtual?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

course content

Kursinnehåll

C++ OOP

C++ OOP

1. Grunderna i OOP i C++
2. Konstruktorer och Destruktorer
3. Översikt Av Inkapsling
4. Översikt av Arv
5. Översikt av Polymorfism

book
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

Base.h

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

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
Notering

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

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
Notera

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

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

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.

question mark

Vad är huvudsyftet med nyckelordet virtual?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 2
some-alt