Hjem Personlig finansiering Abstrakte klasser og C ++ dummier

Abstrakte klasser og C ++ dummier

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

Video: [C++ von { bis }] 14 - Abstrakte Klassen 2025
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

Hvordan man vælger vielsesringe

Hvordan man vælger vielsesringe

Selvom brudgommen handler solo til forlovelsesringen, sporer par normalt hinanden om deres vielsesringe. Nogle vælger matchende vielsesringe, men det behøver du ikke. Hvis du vil have et almindeligt guldband og din forlovede ønsker noget mere avanceret, er der ingen grund til, at du ikke begge kan have det, du vil have. Vælg en ...

Hvordan man holder styr på bryllupsgaver

Hvordan man holder styr på bryllupsgaver

Mister sporet af bryllupsgaver og deres givere kan være et mareridt . I det øjeblik du åbner en bryllupsgave, skriv ned hvad det er, hvem gav det til dig og datoen. Disse oplysninger kan gå på et indekskort med gæstens øvrige oplysninger i et regneark. Optag også, når du sender hver ...

Hvordan man vælger en forlovelsesring - dummier

Hvordan man vælger en forlovelsesring - dummier

Bragt til dig af Engagement og vielsesringe kommer i et stort udvalg af stilarter og materiale. Når man handler for forlovelses- og vielsesringe, går mange par sammen - eller i det mindste forudforhandler sammen, så hver person har en ide om den andens smag. Når du vælger ringe, skal du overveje din livsstil og prisklasse, og ...

Valg af editor

Forbedre dine Excel-rapporter ved de-Emphasizing Borders - dummies

Forbedre dine Excel-rapporter ved de-Emphasizing Borders - dummies

Borddesign er en af ​​de mest undervurderede bestræbelser i Excel-rapportering. Tro det eller ej, grænser kommer i vejen for hurtigt at læse dataene i en tabel. Fordi grænserne hjælper med at adskille data i pænt opdelte sektioner, kan det virke kontraintuitivt, men virkeligheden er, at bordets grænser er det første, du ...

Identificere problemet, som din finansielle model skal løse - dummies

Identificere problemet, som din finansielle model skal løse - dummies

En økonomisk model er normalt bygget for at besvare et spørgsmål eller at løse et problem. For eksempel spørgsmålet "Skal jeg købe dette nye aktiv? "Kan resultere i en model, der indeholder cash flow analyse, som sammenligner cash flow, hvis aktivet er købt versus, hvis det ikke købes. "Hvor meget skal ...

Sådan bruges VBA-regnearkfunktioner i Excel 2016 - dummies

Sådan bruges VBA-regnearkfunktioner i Excel 2016 - dummies

Selvom VBA tilbyder et anstændigt sortiment af bygget - i funktioner, kan du ikke altid finde præcis, hvad du har brug for. Heldigvis kan du også bruge de fleste af Excels regnearkfunktioner i dine VBA-procedurer. De eneste regnearkfunktioner, som du ikke kan bruge, er dem, der har en tilsvarende VBA-funktion. For eksempel kan du ikke bruge Excel's RAND ...

Valg af editor

Sådan går du ind i en Ham Radio Contact - dummies

Sådan går du ind i en Ham Radio Contact - dummies

Nogle gange kan du ikke vente på slutningen af ​​en kontakt til at ringe til en skinke radiostation. Afbrydelse af en anden kontakt kaldes at bryde ind (eller bryde). Den rigtige procedure er at vente på en pause i kontakten og hurtigt sige "Break" (eller send BK med Morse kode) efterfulgt af dit kaldesignal. Hvorfor gør du ...

Basics of High Frequency (HF) Ham Radios - Dummies

Basics of High Frequency (HF) Ham Radios - Dummies

Alle moderne skinke radioer har perfekt brugbar modtagelse og transmittere ydeevne. Forskellene involverer ydeevne på flere nøgleområder, såsom evnen til at modtage i nærvær af stærke signaler, signalfiltrering og filterstyringsfunktioner, dækning af et eller flere VHF / UHF-bånd, driftsfunktioner såsom subreceivers og antal indbyggede i antenne tunere. HF-radioer ...

Sådan vælger du en Ham Radio Antenne - Dummies

Sådan vælger du en Ham Radio Antenne - Dummies

Det er svært at sige, hvilket er vigtigt for en skinke radio operatør: radioen eller antennen. At klare mangler i en ved at forbedre den anden er vanskelig. En god antenne kan gøre en svag radio lyd bedre end den anden vej. Du skal give antennevalg mindst lige så meget ...