Video: CONST in C++ 2024
I C ++, bara för att du tror att ett visst funktionssamtal är bunden sent betyder inte att det är. Om deklareras inte med samma argument i underklasserna, överskrids inte medlemsfunktionerna polymorfiskt, oavsett om de deklareras virtuella.
Ett undantag till samma deklarationsregel är att om medlemsfunktionen i basklassen returnerar en pekare eller referens till ett basklassobjekt, kan en överdriven medlemsfunktion i en underklass returnera en pekare eller referens till ett objekt i underklass. Med andra ord är funktionen makeACopy () polymorf, även om returtypen för de två funktionerna skiljer sig:
klassbas {public: // returnera en kopia av det aktuella objektet Base * makeACopy ();}; klass SubClass: public Base {public: // returnera en kopia av det aktuella objektet SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. göra en kopia(); // fortsätt på …}
I praktiken är detta ganska naturligt. En makeACopy () -funktion ska returnera ett objekt av typen SubClass , , även om det kan överväga BaseClass:: makeACopy () .
Denna verksamhet av tyst bestämmer när en funktion är överdriven och när det inte är en felkälla i C ++; så mycket att 2011-standarden introducerade beskrivaren åsidosätt som programmeraren kan använda för att indikera hennes avsikt att åsidosätta en basklassfunktion.
C ++ genererar ett kompilatorfel om en funktion förklaras åsidosättas, men överstiger faktiskt inte en basklassfunktion av någon anledning (t.ex. ett felaktigt argument) som i följande exempel: >
Det här koden genererar ett kompileringstidsfel eftersom metoden GradStudent:: addCourseGrade (float) förklarades åsidosättas, men det överväger inte faktiskt basklassfunktionen Student:: addCourseGrade (double) eftersom argumenttyperna don ' t match.
slutlig , även om den funktionen i sig överskrider någon tidigare basklassfunktion, vilket visas i följande ytterligare > PostDoc klass: klass GradStudent: allmän student {public: virtual void addCourseGrade (double grade) final;}; klass PostDoc: public GradStudent {public: virtual void addCourseGrade (dubbelklass);}; Eftersom Student:: addCourseGrade () är märkt slutlig
,
förklaringen av PostDoc:: addCourseGrade () genererar ett fel eftersom det försöker åsidosätta metoden Student .
klass GradStudent final: allmän student Detta påverkar mer än bara klassens virtuella metoder. En
slutlig
klass kan inte ärftas från alls.