Video: Hotpoint-Ariston ELTF11M121CEU vaatwasser. Volledig integreerbare vaatwasser van Hotpoint 2024
in C ++, alleen omdat u denkt dat een bepaalde functie-aanroep te laat is gebonden, niet betekent dat dat zo is. Indien niet gedeclareerd met dezelfde argumenten in de subklassen, worden de lidfuncties niet polymorf gedicteerd, ongeacht of ze virtueel verklaard zijn of niet.
Een uitzondering op de identieke declaratieregel is dat als de lidfunctie in de basisklasse een aanwijzer of verwijzing naar een basisklasseobject retourneert, een overschreven lidfunctie in een subklasse een aanwijzer of verwijzing naar een object van de subklasse kan retourneren. Met andere woorden, de functie makeACopy () is polymorf, hoewel het retourneertype van de twee functies verschilt:
class Base {public: // retourneer een kopie van het huidige object Base * makeACopy ();}; class SubClass: public Base {public: // retourneer een kopie van het huidige object SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. een kopie maken(); // ga verder …}
In de praktijk is dit vrij natuurlijk. Een makeACopy () -functie zou een object van het type SubClass , moeten retourneren, zelfs als dit BaseClass zou kunnen overschrijven:: makeACopy () .
Dit is het stilzwijgend beslissen wanneer een functie wordt opgeheven en wanneer dit geen bron van fouten is in C ++; zozeer zelfs dat de norm uit 2011 de descriptor negeren introduceerde die de programmeur kan gebruiken om aan te geven dat ze van plan is een basisklasse-functie te negeren.
C ++ genereert een compileerfout als een functie wordt gedeclareerd maar negeert, in feite, een basisklasse-functie om de een of andere reden (zoals een niet-overeenkomend argument) zoals in het volgende voorbeeld: >
Dit fragment genereert een compileerfout omdat de methode GradStudent:: addCourseGrade (float) is gedeclareerd maar dit heeft in feite niet de basisklassefunctie overschreven Student:: addCourseGrade (dubbel) omdat de argumenttypen niet ' t match.
final , zelfs als die functie zelf een eerdere basisklasse-functie vervangt, zoals aangetoond in de volgende aanvullende > PostDoc klasse: klasse GradStudent: public Student {public: virtual void addCourseGrade (double grade) final;}; class PostDoc: public GradStudent {public: virtual void addCourseGrade (double grade);}; Aangezien Student:: addCourseGrade () is gemarkeerd als final
,
de declaratie van PostDoc:: addCourseGrade () genereert een fout omdat deze de methode Student negeert.
klasse GradStudent definitief: openbaar Student Dit is van invloed op meer dan alleen de virtuele methoden van de klas. Een
finale
-klasse kan helemaal niet worden geërfd.