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