Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Ren Metode Uden Implementering | Oversigt Over Polymorfi
C++ OOP
course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Ren Metode Uden Implementering

Begrebet virtuelle metoder er centralt for at opnå polymorfi, hvilket muliggør fleksibelt og udvideligt 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 den pågældende class kan instantieres.

virtual.h

virtual.h

copy
1
virtual 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 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 implementeres, før der kan oprettes og bruges en instans, for at forhindre fejl og uforudsigelig opførsel. Se koden nedenfor:

Animal.h

Animal.h

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

Animal class indeholder en ren virtuel metode kaldet speak(), hvilket forhindrer oprettelsen af objekter fra denne klasse. Dette design er hensigtsmæssigt, 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

main.cpp

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

Dette giver også mening. 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 forstærker den abstrakte karakter af class og understreger vigtigheden af at oprette specialiserede subklasser for at indfange de unikke lyde fra hvert enkelt dyr.

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); }

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.

Note
Bemærk

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 instantiering på grund af ikke-implementerede rene virtuelle metoder.

question mark

Hvad sker der, når en klasse indeholder en ren virtuel metode?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

course content

Kursusindhold

C++ OOP

C++ OOP

1. Grundlæggende OOP i C++
2. Konstruktører og Destruktører
3. Oversigt Over Indkapsling
4. Oversigt over Arv
5. Oversigt Over Polymorfi

book
Ren Metode Uden Implementering

Begrebet virtuelle metoder er centralt for at opnå polymorfi, hvilket muliggør fleksibelt og udvideligt 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 den pågældende class kan instantieres.

virtual.h

virtual.h

copy
1
virtual 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 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 implementeres, før der kan oprettes og bruges en instans, for at forhindre fejl og uforudsigelig opførsel. Se koden nedenfor:

Animal.h

Animal.h

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

Animal class indeholder en ren virtuel metode kaldet speak(), hvilket forhindrer oprettelsen af objekter fra denne klasse. Dette design er hensigtsmæssigt, 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

main.cpp

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

Dette giver også mening. 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 forstærker den abstrakte karakter af class og understreger vigtigheden af at oprette specialiserede subklasser for at indfange de unikke lyde fra hvert enkelt dyr.

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); }

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.

Note
Bemærk

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 instantiering på grund af ikke-implementerede rene virtuelle metoder.

question mark

Hvad sker der, når en klasse indeholder en ren virtuel metode?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 3
some-alt