Hjem Personlig finansiering Abstrakte klasser og C ++ dummier

Abstrakte klasser og C ++ dummier

Video: [C++ von { bis }] 14 - Abstrakte Klassen 2024

Video: [C++ von { bis }] 14 - Abstrakte Klassen 2024
Anonim

C ++ understøtter sen binding , , som er, når det løser et metodeopkald baseret på løbetid type (eller dynamisk type) af målobjektet i stedet for den angivne type (eller statisk type). Dette er demonstreret i følgende C ++ kodebits:

#include using namespace std; klasse ovn {public: virtuel tomrumskog () {cout << "madlavning med en ovn" << endl;}}; klasse MicrowaveOven: public Oven {public: virtual void cook () {cout << "madlavning med mikrobølgeovn" << endl;}}; void preparationMeal (Ovn & ovn) {ovn. cook ();}

I funktionen prepareMeal (), opkaldet til ovnen. koge () kan passere til ovn:: cook () eller microwaveOven:: cook () afhængig af kørselstidspunktet (den "aktuelle") type af ovnen, der er bestået.

Det virtuelle søgeord er kritisk her. Uden det ville cook () -metoden være bundet tidligt, baseret på kompileringstidstypen, og påberåbe ovnen:: cook () hver gang. Når det er blevet erklæret virtuelt i ovnen klassen, antages metoden at være virtuel i hver underklasse, men det gør ikke ondt for at gentage erklæringen, så læserne forstår.

Følgende enkle program demonstrerer dette princip i praksis:

int main () {Ovnen ovn; prepareMeal (ovn); MicrowaveOven mo; prepareMeal (mo); returnere 0;}

I dette program genererer opkaldet til at lave mad () to forskellige udgange afhængigt af ovnen:

Madlavning med en ovn Kogning med mikrobølgeovn

Det er ikke altid tilfældet, at en metode i basisklassen kan defineres. Overvej ovnen tilfældet mere omhyggeligt. Der findes en række forskellige typer ovne - konventionelle ovne, konvektionsovne og mikrobølgeovne - men man kan hævde, at der ikke er nogen egentlig ovn, der ikke hører til en af ​​disse underklasser. Du kan muligvis sige, hvordan de forskellige typer ovne udfører kokken operationen - det vil sige, hvad en KonventionelOven:: cook () og en MicrowaveOven:: cook () skal gøre kan defineres. Det er sandsynligvis ikke muligt at definere hvilke handlinger Oven:: cook () skal udføre.

Du kan ikke bare forlade Oven:: cook () sort i et stærkt skrevet sprog som C ++. Du kan dog erklære en metode, men lad den ikke gennemføres , hvis der ikke findes nogen implementering. Man bruger følgende nysgerrige syntaks til at gøre det:

klasse Ovn {public: virtual void cook () = 0;};

Denne kode erklærer en metode Ovn:: cook (), der er bundet sent, men implementerer ikke metoden. Faktisk går det videre ved at sige, at metoden ikke vil blive gennemført. I C ++ siges en sådan metode som ren virtuel . C ++ programmører bruger også udtrykket foretrukket i mange andre stærkt typede computersprog: abstrakt .Oven klassen siges at være abstrakt.

Et abstrakt repræsenterer en ejendom, som du ved, at klassen besidder, men ved ikke, hvordan man implementerer entydigt i den nuværende klasse.

En klasse er abstrakt, hvis den indeholder en eller flere rene virtuelle metoder. Betydningen af ​​dette er, at du ikke kan instantiere en abstrakt klasse. Således er følgende ikke længere tilladt:

int main () {Ovnen ovn; prepareMeal (ovn); returner 0;}

Årsagen til dette er ret simpelt: hvis du lavede et objekt af klasse Ovn og derefter forsøgte at påberåbe ovnen. cook (), hvad skal kompilatoren gøre?

På et mere filosofisk niveau er det fint at sige, at der er nogle almindelige betegnelser kaldet Ovn, der beskriver konventionelle ovne og mikrobølgeovne og konvektionsovne. Dette udtryk Ovn er et sædvanligt koncept, fordi det binder lighederne i alle disse underklasser. Men der er ingen forekomst af en ovn, der ikke er en af ​​ovnens underklasser.

En underklasse af en abstrakt klasse er selv abstrakt, indtil alle rene virtuelle metoder er blevet overskredet af ikke-abstrakte (det vil sige konkrete ) versioner. Klassen MicrowaveOven i den forrige kodestykke er således ikke abstrakt - selvom ovnen var abstrakt - fordi den tilsidesætter cook () med sin egen konkrete version.

Bemærk, at der ikke er noget galt med funktionen prepareMeal () defineret som følger:

void preparationMeal (Ovn og ovn) {ovn. cook ();}

Selvom argumentet erklæres for at være en Ovn, kan det kun påberåbes med en del underklasse Ovn, f.eks. MicrowaveOven eller ConventionalOven, for hvilken cook () er defineret.

Abstrakte klasser og C ++ dummier

Valg af editor

Routingprotokollvalgskriterier - dummies

Routingprotokollvalgskriterier - dummies

Folk bruger to grundlæggende metoder til klassificering af ruteprotokoller - hvor de bruges og af hvordan de beregner routing. Du kan se, hvordan du vælger protokoller baseret på, hvor du planlægger at bruge dem, måden protokollen håndterer data på, og hvordan din router vælger hvilken protokol der skal bruges, når mere end en ...

Indstilling af Cisco Device Timeouts - dummies

Indstilling af Cisco Device Timeouts - dummies

Uden at indstille timeout-indstillinger for Cisco Device Privileged EXEC-tilstand, dine sessioner forbliver åbne på ubestemt tid. Dette er især farligt for konsolporten. Uden timeout parametre aktiveret, hvis administratoren ikke logger ud, har en indtrenger adgang og ingen problemer får forhøjede tilladelser. For at undgå denne potentielt farlige situation behøver du kun skrive a ...

Router Ethernet-interfacekonfiguration - dummies

Router Ethernet-interfacekonfiguration - dummies

Du starter processen med at konfigurere router Ethernet-grænseflader ved at foretage en fysisk forbindelse til din router. Når du har etableret forbindelsen, kan du fortsætte med den grundlæggende konfiguration af Ethernet-, Fast Ethernet- eller Gigabit Ethernet-forbindelser. Tilslutning til din router For at starte din konfiguration skal du oprette forbindelse til din router og komme ind i ...

Valg af editor

Med fokus på nogle hurtige løsninger til fotofile - dummier

Med fokus på nogle hurtige løsninger til fotofile - dummier

På trods af alle kameraproducenters forsøg på at gør fotografering idiotsikker, vi laver alle stadig mindre end perfekte billeder. Nogle gange er vi problemet - vi er for tætte eller for langt væk, eller kan ikke finde ud af, hvordan du bruger kameraets tåbebeskyttelsesfunktioner. Nogle gange er problemet, at virkeligheden nøjagtigt nægter at overholde vores forventninger: Himlen er ...

Lær at kende dine Manga Studio Layer Typer - Dummies

Lær at kende dine Manga Studio Layer Typer - Dummies

Manga Studio giver et udvalg af lag typer til brug i dit arbejde. Når du lærer at forstå og forstå, hvordan lag fungerer, vil du spekulere på, hvordan du nogensinde har arbejdet uden dem. Her er en introduktion til, hvad Manga Studio har til opbevaring for dig i sin lag lineup: Raster Layer: Dette er det grundlæggende ...

Få dit mobilwebsted tildelt på sociale bogmærker - dummies

Få dit mobilwebsted tildelt på sociale bogmærker - dummies

Populariteten af ​​websider med antallet af stemmer, de får. Resultatet er, at disse websteder er gode ressourcer til folk, der ønsker at holde øje med, hvad der er populært online. De fleste tilbyder speciel software, der gør det nemt for alle at stemme på et websted. Få dit websted opført ...

Valg af editor

Automatisk opdatering af din journal i Outlook 2000 - dummies

Automatisk opdatering af din journal i Outlook 2000 - dummies

Stardat 2001: På Star Trek, Virksomheden gør trofast daglige poster i kaptajnens log. Kaptajnen registrerer oplysninger om de planeter, besætningen har udforsket, udlændinge, de har kæmpet, og de bizarre fænomener, de har observeret ud i det dybe rum, hvor ingen er gået før! Nu er det din tur. Bare ...

Slet og gendan kontakter i Outlook - dummies

Slet og gendan kontakter i Outlook - dummies

Med Outlook, du behøver ikke at rive sider ud af en papir adressebog for at slippe af med en persons oplysninger; bare slet kontakten. Slettede kontakter går til mappen Slette emner i Outlook, indtil næste gang du tømmer mappen Slette elementer, så du kan hente dem derfra, hvis du laver ...