Video: Writing 2D Games in C using SDL by Thomas Lively 2025
I C ++, bare fordi du tror at et bestemt funksjonsanrop er bundet sent betyr det ikke at det er. Hvis ikke deklarert med de samme argumentene i underklassene, blir medlemsfunksjonene ikke overstyrt polymorphically, uansett om de er deklarert virtuelt.
Ett unntak til den samme deklarasjonsregelen er at hvis medlemsfunksjonen i grunnklassen returnerer en peker eller referanse til en basisklasseobjekt, kan en overstyrt medlemsfunksjon i en underklasse returnere en peker eller referanse til en gjenstand av underklasse. Med andre ord, funksjonen makeACopy () er polymorf, selv om returtypen for de to funksjonene er forskjellig:
klasse Base {public: // returnere en kopi av det nåværende objektet Base * makeACopy ();}; klasse SubClass: offentlig Base {public: // returnere en kopi av det nåværende objektet SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. lag en kopi(); // Fortsett på …}
I praksis er dette ganske naturlig. En makeACopy () -funksjon skal returnere et objekt av typen SubClass , , selv om det kan overstyre BaseClass:: makeACopy () .
Denne virksomheten av stillhet bestemmer når en funksjon er overstyrt, og når ikke, er en feilkilde i C ++; så mye at 2011-standarden introduserte beskrivelsen overstyr som programmereren kan bruke til å indikere at hun har til hensikt å overstyre en baseklassefunksjon.
C ++ genererer en kompilatorfeil hvis en funksjon erklæres å overstyre, men overstyrer ikke en grunnklassefunksjon av en eller annen grunn (for eksempel et feilparametert argument) som i følgende eksempel: >
Denne brikken genererer en kompileringstidsfeil fordi metoden GradStudent:: addCourseGrade (float) ble erklært forstyrret, men den overstyrer ikke grunnleggende klassefunksjonen Student:: addCourseGrade (dobbel) fordi argumenttypene don ' t-kamp.
siste søkeordet, selv om den funksjonen selv tilsidesætter noen tidligere baseklassefunksjon, som vist i følgende tilleggsinformasjon > PostDoc klasse: klasse GradStudent: offentlig student {offentlig: virtuell void addCourseGrade (double grade) final;}; klasse PostDoc: public GradStudent {public: virtual void addCourseGrade (dobbel klasse);}; Siden Student:: addCourseGrade () er merket endelig
,
erklæringen av PostDoc:: addCourseGrade () genererer en feil fordi den forsøker å overstyre Student metoden.
klasse GradStudent-finalen: offentlig student Dette påvirker mer enn bare de virtuelle metodene til klassen. En
siste
klasse kan ikke arves fra det hele tatt.
