Ren Metode Uten Implementasjon
Konseptet med virtuelle metoder er sentralt for å oppnå polymorfisme, og muliggjør fleksibel og utvidbar programvaredesign. Rene virtuelle metoder utvider dette ved å definere grensesnitt og støtte dynamisk binding.
Syntaks for ren virtuell metode
En ren virtuell metode deklareres med nøkkelordet virtual
og initialiseres til null. Dette indikerer at funksjonen ikke har noen definisjon i class
og må overstyres av enhver subklasse før objekter av den class
kan instantieres.
virtual.h
1virtual void example() = 0;
Denne metoden fungerer på samme måte som en standardmetode, bortsett fra at den mangler en kropp omsluttet av { }
og i stedet avsluttes med = 0;
, noe som indikerer at den ikke har noen implementasjon. De øvrige reglene for denne metoden er de samme som for vanlige metoder.
Å erklære en ren virtuell metode gjør class
-en der den er erklært abstrakt, noe som betyr at det blir umulig å instansiere objekter av denne klassen. Denne begrensningen finnes fordi alle metoder i class
må være implementert før man kan opprette og bruke en instans, for å unngå feil og uforutsigbar oppførsel. Se på koden nedenfor:
Animal.h
1234class Animal { public: virtual void speak() = 0; };
Animal
class
har en ren virtuell metode kalt speak()
, noe som forhindrer instansiering av objekter fra denne class. Dette er hensiktsmessig, ettersom hensikten med den virtuelle metoden er å representere de karakteristiske lydene hvert dyr lager.
Ved å gjøre metoden virtuell kan hver subklasse implementere sin egen versjon, slik at individualiteten til hvert dyrs lyd fanges opp. Å erklære den som ren virtuell indikerer at det ikke finnes noen standardimplementasjon, og understreker behovet for konkrete implementasjoner i avledede klasser.
main.cpp
1234567#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Dette er også logisk. Å opprette instanser av Animal
class
ville vært upraktisk og mot sin hensikt, siden den representerer et abstrakt konsept som fungerer som en kategori for ulike dyr. Det finnes ingen spesifikk oppførsel knyttet til et generelt dyr, noe som forsterker den abstrakte naturen til class
og fremhever viktigheten av å lage spesialiserte subklasser for å fange de unike lydene til hvert enkelt 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); }
Selv om det ikke er mulig å opprette et objekt av typen Animal
direkte, kan vi fortsatt bruke det som en parameter i en funksjon. På samme måte som i det tidligere knappeeksemplet, utnytter denne tilnærmingen polymorfisme for å lage et allsidig program som kan endre oppførsel dynamisk under kjøring.
Prøv å sende et objekt av en annen class
til funksjonen og observer resultatet. Forsøk også å opprette et objekt av den abstrakte class
for å se hvordan kompilatoren forhindrer instansiering på grunn av uimplementerte rene virtuelle metoder.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår