Video: Zeitgeist Addendum 2025
I C ++ betyder det bare fordi du tror at et bestemt funktionsopkald er bundet sent, ikke betyder at det er. Hvis ikke deklareres med de samme argumenter i underklasserne, overstyres medlemsfunktionerne ikke polymorfisk, uanset om de er erklæret virtuelle.
En undtagelse til den samme erklæringsregel er, at hvis en medlemsfunktion i basisklassen returnerer en pointer eller reference til en basisklasseobjekt, kan en overstyret medlemsfunktion i en underklasse returnere en pointer eller reference til en objekt i underklassen. Med andre ord er funktionen makeACopy () polymorf, selvom returtypen af de to funktioner er forskellige:
klasse Base {public: // returnere en kopi af det aktuelle objekt Base * makeACopy ();}; klasse SubClass: offentlig Base {public: // returnere en kopi af det aktuelle objekt SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. lav en kopi(); // Fortsæt på …}
I praksis er dette ret naturligt. En makeACopy () -funktion skal returnere et objekt af typen SubClass , , selv om det måske tilsidesætter BaseClass:: makeACopy () .
Denne forretning er stilfuldt afgørende, når en funktion overskrides, og når den ikke er en fejlkilde i C ++; så meget, at 2011-standarden introducerede beskrivelsen tilsidesættelse , som programmøren kan bruge til at angive hendes hensigt at tilsidesætte en baseklassefunktion.
C ++ genererer en compilerfejl, hvis en funktion erklæres tilsidesat, men overhovedet ikke overstiger en baseklassefunktion af en eller anden grund (f.eks. Et fejlagtigt argument) som i følgende eksempel: >
Dette uddrag genererer en kompileringstidfejl, fordi metoden GradStudent:: addCourseGrade (float) blev erklæret tilsidesat, men den overstyrer faktisk ikke basklassefunktionen Student:: addCourseGrade (double), fordi argumenttyperne don ' t match.
endelige søgeord, selvom den funktion selv tilsidesætter en tidligere basisklassefunktion som vist i følgende yderligere > PostDoc klasse: klasse GradStudent: offentlig studerende {offentligt: virtuelt tomrum addCourseGrade (double grade) final;}; klasse PostDoc: public GradStudent {public: virtuel void addCourseGrade (double grade);}; Siden Student:: addCourseGrade () er markeret endelig
,
erklæringen af PostDoc:: addCourseGrade () genererer en fejl, fordi den forsøger at tilsidesætte metoden Student .
klasse GradStudent endelig: offentlig studerende Dette påvirker mere end blot de virtuelle metoder i klassen. En klasse
endelig
kan ikke arves overhovedet.