Ren Metode Uden Implementering
Begrebet virtuelle metoder er centralt for at opnå polymorfi og muliggør fleksibel og udvidelig softwaredesign. Rene virtuelle metoder udvider dette ved at definere grænseflader og understøtte dynamisk binding.
Syntaks for ren virtuel metode
En ren virtuel metode erklæres med nøgleordet virtual og initialiseres til nul. Dette angiver, at funktionen ikke har nogen definition i class og skal overskrives af enhver subklasse, før objekter af denne class kan instantieres.
virtual.h
1virtual void example() = 0;
Denne metode fungerer på samme måde som en standardmetode, bortset fra at den mangler en krop omsluttet af { } og i stedet afsluttes med = 0;, hvilket angiver, at der ikke er nogen implementering. De øvrige regler for denne metode er dog de samme som for almindelige metoder.
Deklaration af en ren virtuel metode gør den class, hvor den er erklæret, abstrakt, hvilket betyder, at det bliver umuligt at instantiere objekter af denne klasse. Denne begrænsning eksisterer, fordi hver metode i class skal være implementeret, før der kan oprettes og bruges en instans, for at forhindre fejl og uforudsigelig adfærd. Se koden nedenfor:
Animal.h
1234class Animal { public: virtual void speak() = 0; };
Animal class indeholder en ren virtuel metode ved navn speak(), hvilket forhindrer oprettelsen af objekter fra denne klasse. Denne tilgang er hensigtsmæssig, da formålet med den virtuelle metode er at repræsentere de karakteristiske lyde, som hvert dyr laver.
Ved at gøre metoden virtuel muliggøres det, at hver subklasse kan implementere sin egen version, hvilket indfanger det enkelte dyrs unikke lyd. At erklære den som ren virtuel angiver, at der ikke findes nogen standardimplementering, og understreger behovet for konkrete implementeringer i afledte klasser.
main.cpp
1234567#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Dette er også logisk. Oprettelse af instanser af Animal class ville være upraktisk og kontraintuitivt, da den repræsenterer et abstrakt begreb, der fungerer som en kategori for forskellige dyr. Der er ingen specifik adfærd forbundet med et generisk dyr, hvilket understreger den abstrakte karakter af class og vigtigheden af at oprette specialiserede subklasser for at indfange de unikke lyde fra hvert specifikt dyr.
main.cpp
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); }
Selvom det ikke er muligt at oprette et objekt af typen Animal direkte, kan vi stadig bruge det som en parameter i en funktion. Ligesom i det tidligere knap-eksempel udnytter denne tilgang polymorfi til at skabe et alsidigt program, der dynamisk kan ændre sin adfærd under kørsel.
Prøv at videregive et objekt af en anden class til funktionen og observer outputtet. Forsøg også at oprette et objekt af den abstrakte class for at se, hvordan compileren forhindrer instansiering på grund af ikke-implementerede rene virtuelle metoder.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 3.13
Ren Metode Uden Implementering
Stryg for at vise menuen
Begrebet virtuelle metoder er centralt for at opnå polymorfi og muliggør fleksibel og udvidelig softwaredesign. Rene virtuelle metoder udvider dette ved at definere grænseflader og understøtte dynamisk binding.
Syntaks for ren virtuel metode
En ren virtuel metode erklæres med nøgleordet virtual og initialiseres til nul. Dette angiver, at funktionen ikke har nogen definition i class og skal overskrives af enhver subklasse, før objekter af denne class kan instantieres.
virtual.h
1virtual void example() = 0;
Denne metode fungerer på samme måde som en standardmetode, bortset fra at den mangler en krop omsluttet af { } og i stedet afsluttes med = 0;, hvilket angiver, at der ikke er nogen implementering. De øvrige regler for denne metode er dog de samme som for almindelige metoder.
Deklaration af en ren virtuel metode gør den class, hvor den er erklæret, abstrakt, hvilket betyder, at det bliver umuligt at instantiere objekter af denne klasse. Denne begrænsning eksisterer, fordi hver metode i class skal være implementeret, før der kan oprettes og bruges en instans, for at forhindre fejl og uforudsigelig adfærd. Se koden nedenfor:
Animal.h
1234class Animal { public: virtual void speak() = 0; };
Animal class indeholder en ren virtuel metode ved navn speak(), hvilket forhindrer oprettelsen af objekter fra denne klasse. Denne tilgang er hensigtsmæssig, da formålet med den virtuelle metode er at repræsentere de karakteristiske lyde, som hvert dyr laver.
Ved at gøre metoden virtuel muliggøres det, at hver subklasse kan implementere sin egen version, hvilket indfanger det enkelte dyrs unikke lyd. At erklære den som ren virtuel angiver, at der ikke findes nogen standardimplementering, og understreger behovet for konkrete implementeringer i afledte klasser.
main.cpp
1234567#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Dette er også logisk. Oprettelse af instanser af Animal class ville være upraktisk og kontraintuitivt, da den repræsenterer et abstrakt begreb, der fungerer som en kategori for forskellige dyr. Der er ingen specifik adfærd forbundet med et generisk dyr, hvilket understreger den abstrakte karakter af class og vigtigheden af at oprette specialiserede subklasser for at indfange de unikke lyde fra hvert specifikt dyr.
main.cpp
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); }
Selvom det ikke er muligt at oprette et objekt af typen Animal direkte, kan vi stadig bruge det som en parameter i en funktion. Ligesom i det tidligere knap-eksempel udnytter denne tilgang polymorfi til at skabe et alsidigt program, der dynamisk kan ændre sin adfærd under kørsel.
Prøv at videregive et objekt af en anden class til funktionen og observer outputtet. Forsøg også at oprette et objekt af den abstrakte class for at se, hvordan compileren forhindrer instansiering på grund af ikke-implementerede rene virtuelle metoder.
Tak for dine kommentarer!