Verder bestuderen we het verschil tussen overbelasting en overriding met behulp van een vergelijkingsgrafiek.
Vergelijkingstabel:
Basis voor vergelijking | overbelasting | overschrijven |
---|---|---|
Prototype | Prototype verschilt als aantal of type parameter kan verschillen. | Alle aspecten van het prototype moeten hetzelfde zijn. |
keyword | Geen sleutelwoord toegepast tijdens overbelasting. | De functie die moet worden opgeheven, wordt voorafgegaan door het sleutelwoord 'virtueel' in de basisklasse. |
Onderscheidende factor | Het aantal of type parameter verschilt afhankelijk van de manier waarop de versie van de functie wordt aangeroepen. | De functie van de klasse wordt aangeroepen door de aanwijzer, wordt bepaald door, adres van welk klasseobject is toegewezen aan die aanwijzer. |
Patroon definiëren | De functie wordt opnieuw gedefinieerd met dezelfde naam, maar met een ander aantal en type parameter. | Functie wordt gedefinieerd, voorafgegaan door een sleutelwoord 'virtueel' in hoofdklasse en geherdefinieerd door afgeleide klasse zonder trefwoord. |
Tijd van vervulling | Compileer tijd. | Looptijd. |
Constructor / Virtuele functie | Constructeurs kunnen overbelast zijn. | Virtuele functie kan worden opgeheven. |
destructor | Destructor kan niet worden overbelast. | Destructor kan worden opgeheven. |
Verbindend | Overbelasting bereikt vroege binding. | Overschrijven verwijst naar late binding. |
Definitie van overbelasting
Compileertijd polymorfisme wordt 'overbelasting' genoemd. Aangezien overbelasting wordt gegenereerd op basis van een concept van polymorfisme, biedt het "een gemeenschappelijke interface voor meerdere methoden". Dat betekent dat als een functie overbelast is, deze dezelfde functienaam bevat wanneer deze wordt geherdefinieerd.
Overbelaste functies verschillen met betrekking tot, verschillend 'aantal of type parameter (s)', het maakt een overbelaste functie verschillend van een andere. Op deze manier herkent de compiler welke overbelaste functie wordt aangeroepen. Meest overbelaste functies zijn 'constructors'. 'Copy constructor' is een soort van 'constructor overloading'.
Implementatie van overbelasting in C ++
klasse overbelasting {int a, b; public: int load (int x) {// eerste load () functie a = x; terug een; } int load (int x, int y) {// tweede laad () functie a = x; b = y; retourneer a * b; }}; int main () {overload O1; O1.load (20); // eerste laad () functieaanroep O1.load (20, 40); // functieaanroep tweede functie ()
Hier is de functie load () van overbelasting van de klasse overbelast. De twee overbelaste functies van de klasse kunnen worden onderscheiden op een manier dat de eerste load () -functie alleen één integer-parameter accepteert, terwijl de tweede load () -functie twee integer-parameters accepteert. Wanneer het object van de klasseoverbelasting de functie load () met een enkele parameter aanroept, wordt de functie first load () aangeroepen. Wanneer object load () functie twee parameters doorgeeft, wordt de functie second load () aangeroepen.
Definitie van Overriding
Polymorfisme behaald tijdens runtime wordt 'dwingend' genoemd. Het wordt bereikt door 'overerving' en 'virtuele functies' te gebruiken. De functie die moet worden opgeheven, wordt voorafgegaan door het sleutelwoord 'virtueel' in een basisklasse en opnieuw gedefinieerd in een afgeleide klasse zonder een trefwoord.
Een van de belangrijkste dingen om te onthouden in het geval van overriding is dat het prototype van de overschreven functie niet mag veranderen, terwijl de afgeleide klasse deze opnieuw definieert. Wanneer de overschreven functie wordt aangeroepen, bepaalt C ++ welke versie van de functie wordt aangeroepen op basis van het 'type van het object dat wordt aangewezen door een aanwijzer' waardoor de functie wordt aangeroepen.
Implementatie van overschrijven in C ++
class base {public: virtual void funct () {// virtuele functie van base class cout << "Dit is de funct van een basisklasse ()"; }}; class derived1: public base {public: void funct () {// virtuele functie van basisklasse geherdefinieerd in derived1 class cout << "Dit is een derived1 class's funct ()"; }}; class derived2: public base {public: void funct () {// virtuele functie van basisklasse geherdefinieerd in derived2 class coutfunct (); // aanroep naar derived1 class function (). * P = & d2; p> funct (); // aanroep naar derived2 class funct (). retourneer 0; }
Hier is er een enkele basisklasse die publiekelijk wordt geërfd door twee afgeleide klassen. Een virtuele functie is gedefinieerd in een basisklasse met een sleutelwoord 'virtueel' en wordt door beide afgeleide klassen opnieuw gedefinieerd zonder trefwoord. In main () maakt base class een pointer-variabele 'p' en een object 'b'; 'derived1' class maakt een object d1 en derived2 class maakt een object d2 '.
Nu wordt in eerste instantie het adres van basisklasse object 'b' toegewezen aan de aanwijzer van de basisklasse 'p'. 'p' roept de functie funct () aan, dus een functie van de basisklasse wordt aangeroepen. Vervolgens wordt het adres van derived1 class-object 'd1' toegewezen aan pointer 'p', opnieuw geeft het call to funct (); hier wordt de functie function () van derived1 class uitgevoerd. Ten slotte wordt aanwijzer 'p' toegewezen aan het object van derived2 class. Vervolgens roept 'p' function funct () aan die de functie func () van derived2 class uitvoert.
Als de klasse derived1 / derived2 funct () niet opnieuw definieerde, zou de functie () van de basisklasse zijn aangeroepen, omdat de virtuele functie 'hierarchisch' is.
Belangrijkste verschillen tussen overbelasting en overschrijven
- Het prototype van een functie die wordt overladen, verschilt vanwege het type en aantal parameters dat wordt doorgegeven aan de overbelaste functie. Aan de andere kant verandert het prototype van de overschreven functie niet, omdat een overschreven functie verschillende acties uitvoert voor verschillende klassen waartoe het behoort maar met hetzelfde type en aantal parameters.
- De overbelaste functienaam gaat niet vooraf aan een willekeurig trefwoord, terwijl de naam van een overschreven functie voorafgaat aan het sleutelwoord "Virtueel" in de basisklasse.
- Welke overbelaste functie wordt aangeroepen, is afhankelijk van het type of het aantal parameters dat aan de functie wordt doorgegeven. De overschreven functie van welke klasse wordt aangeroepen, is afhankelijk van welk objectadres van de klasse is toegewezen aan de aanwijzer, die de functie heeft aangeroepen.
- Welke overbelaste functie moet worden opgeroepen, wordt tijdens het compileren opgelost. Welke overruled-functie moet worden opgeroepen, wordt tijdens runtime opgelost.
- Constructeurs kunnen overbelast zijn maar kunnen niet worden opgeheven.
- Destructors kunnen niet worden overbelast, maar ze kunnen worden opgeheven.
- Overbelasting bereikt vroege binding, omdat de overbelaste functie wordt aangeroepen en tijdens het compileren wordt opgelost. Door te negeren wordt late binding bereikt, omdat de functie waarvoor wordt overschreven, wordt opgeroepen tijdens runtime.
overeenkomsten
- Beide worden toegepast op lidfuncties van een klasse.
- Polymorfisme is het basisconcept achter beide.
- De functienaam blijft hetzelfde terwijl we overbelasting toepassen en de functies overschrijven.
Conclusie
Overloading en overriding lijken op elkaar, maar dit is niet het geval. Functies kunnen worden overbelast, maar elke klasse kan de overbelaste functie in de toekomst niet verder herdefiniëren. Een virtuele functie kan niet worden overbelast; ze kunnen alleen worden opgeheven.