Kursinnehåll
C++ OOP
C++ OOP
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 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
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
#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
#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.
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.
Tack för dina kommentarer!