Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Ren Metod Utan Implementation | Ö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
Ren Metod Utan Implementation

Begreppet virtuella metoder är centralt för att uppnå polymorfism och möjliggör flexibel och utbyggbar mjukvarudesign. Abstrakta (rena) virtuella metoder utökar detta genom att definiera gränssnitt och stödja dynamisk bindning.

Syntax för ren virtuell metod

En ren virtuell metod deklareras med nyckelordet virtual och initieras till noll. Detta indikerar att funktionen saknar definition i class och måste överskuggas av varje subklass innan objekt av den class kan instansieras.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Denna metod fungerar på liknande sätt som en vanlig metod, förutom att den saknar en kropp omsluten av { } och istället avslutas med = 0;, vilket indikerar att ingen implementation finns. Övriga regler för denna metod är desamma som för vanliga metoder.

Att deklarera en ren virtuell metod gör den class där den deklareras abstrakt, vilket innebär att det blir omöjligt att instansiera objekt av den klassen. Denna begränsning finns eftersom varje metod i class måste implementeras innan en instans kan skapas och användas, för att förhindra fel och oförutsägbart beteende. Se på koden nedan:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

Animal class innehåller en ren virtuell metod vid namn speak(), vilket förhindrar att objekt kan skapas direkt från denna klass. Denna utformning är logisk, eftersom syftet med den virtuella metoden är att representera de unika ljuden som varje djur gör.

Genom att göra metoden virtuell möjliggörs det för varje subklass att implementera sin egen version, vilket fångar varje djurs individuella ljud. Att deklarera den som ren virtuell indikerar att ingen standardimplementering finns, vilket betonar behovet of konkreta implementationer i de ärvda klasserna.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Detta är också logiskt. Att skapa instanser av Animal class vore opraktiskt och motintuitivt, eftersom den representerar ett abstrakt begrepp som fungerar som en kategori för olika djur. Det finns inget specifikt beteende kopplat till ett generiskt djur, vilket förstärker den abstrakta karaktären hos class och understryker vikten av att skapa specialiserade subklasser för att fånga de unika ljuden hos varje specifika djur.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Även om det inte är möjligt att skapa ett objekt av typen Animal direkt, kan vi ändå använda det som en parameter i en funktion. Precis som i det tidigare knapp-exemplet utnyttjar detta tillvägagångssätt polymorfism för att skapa ett mångsidigt program som dynamiskt kan ändra sitt beteende under körning.

Note
Notera

Prova att skicka ett objekt av en annan class till funktionen och observera resultatet. Försök även att skapa ett objekt av den abstrakta class för att se hur kompilatorn förhindrar instansiering på grund av ej implementerade rena virtuella metoder.

question mark

Vad händer när en klass innehåller en ren virtuell metod?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 3

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
Ren Metod Utan Implementation

Begreppet virtuella metoder är centralt för att uppnå polymorfism och möjliggör flexibel och utbyggbar mjukvarudesign. Abstrakta (rena) virtuella metoder utökar detta genom att definiera gränssnitt och stödja dynamisk bindning.

Syntax för ren virtuell metod

En ren virtuell metod deklareras med nyckelordet virtual och initieras till noll. Detta indikerar att funktionen saknar definition i class och måste överskuggas av varje subklass innan objekt av den class kan instansieras.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Denna metod fungerar på liknande sätt som en vanlig metod, förutom att den saknar en kropp omsluten av { } och istället avslutas med = 0;, vilket indikerar att ingen implementation finns. Övriga regler för denna metod är desamma som för vanliga metoder.

Att deklarera en ren virtuell metod gör den class där den deklareras abstrakt, vilket innebär att det blir omöjligt att instansiera objekt av den klassen. Denna begränsning finns eftersom varje metod i class måste implementeras innan en instans kan skapas och användas, för att förhindra fel och oförutsägbart beteende. Se på koden nedan:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

Animal class innehåller en ren virtuell metod vid namn speak(), vilket förhindrar att objekt kan skapas direkt från denna klass. Denna utformning är logisk, eftersom syftet med den virtuella metoden är att representera de unika ljuden som varje djur gör.

Genom att göra metoden virtuell möjliggörs det för varje subklass att implementera sin egen version, vilket fångar varje djurs individuella ljud. Att deklarera den som ren virtuell indikerar att ingen standardimplementering finns, vilket betonar behovet of konkreta implementationer i de ärvda klasserna.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Detta är också logiskt. Att skapa instanser av Animal class vore opraktiskt och motintuitivt, eftersom den representerar ett abstrakt begrepp som fungerar som en kategori för olika djur. Det finns inget specifikt beteende kopplat till ett generiskt djur, vilket förstärker den abstrakta karaktären hos class och understryker vikten av att skapa specialiserade subklasser för att fånga de unika ljuden hos varje specifika djur.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Även om det inte är möjligt att skapa ett objekt av typen Animal direkt, kan vi ändå använda det som en parameter i en funktion. Precis som i det tidigare knapp-exemplet utnyttjar detta tillvägagångssätt polymorfism för att skapa ett mångsidigt program som dynamiskt kan ändra sitt beteende under körning.

Note
Notera

Prova att skicka ett objekt av en annan class till funktionen och observera resultatet. Försök även att skapa ett objekt av den abstrakta class för att se hur kompilatorn förhindrar instansiering på grund av ej implementerade rena virtuella metoder.

question mark

Vad händer när en klass innehåller en ren virtuell metod?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 3
some-alt