Kursusindhold
C++ OOP
C++ OOP
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 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
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
#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
#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 instantiering på grund af ikke-implementerede rene virtuelle metoder.
Tak for dine kommentarer!