Vergelijkingstabel
Basis voor vergelijking | Erfenis | polymorfisme |
---|---|---|
basis- | Overname is een nieuwe klasse maken met behulp van de eigenschappen van de al bestaande klasse. | Polymorfisme is in feite een gemeenschappelijke interface voor meerdere vormen. |
Implementatie | Overname wordt in principe geïmplementeerd in klassen. | Polymorfisme is in principe geïmplementeerd op functie / methoden. |
Gebruik | Het concept van herbruikbaarheid in OOP ondersteunen en de lengte van code verminderen. | Hiermee kan het object beslissen welke vorm van de functie moet worden opgeroepen wanneer, tijdens compileren (overbelasting) en runtime (overriding). |
vormen | Overerving kan een enkele overerving, meerdere overerving, multilevelovername, hiërarchische overerving en hybride overerving zijn. | Polymorfisme kan een compileertijd polymorfisme (overbelasting) of runtime-polymorfisme (overriding) zijn. |
Voorbeeld | De klasse 'table' kan de eigenschap van de klasse 'meubels' erven, zoals een 'tafel' een 'meubel' is. | De klasse 'study_table' kan ook de functie 'set_color ()' hebben en een klasse 'Dining_table' kan ook de functie 'set_color ()' hebben, dus welke vorm van de set_color () functie die moet worden opgeroepen kan op zowel compileertijd als looptijd. |
Definitie van Inheritance:
Overerving is een van de cruciale kenmerken van OOP, die "herbruikbaarheid" sterk ondersteunen. Herbruikbaarheid kan worden omschreven als het maken van een nieuwe klasse door de eigenschappen van de bestaande klasse opnieuw te gebruiken. Bij overerving is er een basisklasse die wordt overgenomen door de afgeleide klasse. Wanneer een klasse een andere klasse erft, worden de leden van de basisklasse het lid / de leden van een afgeleide klasse.
De algemene vorm van het erven van een klasse is als volgt:
class derived-class-name: access-specifier base-class-naam {// body van de klasse};
Hier geeft de toegangsspecificatie de toegangsmethode (privé, openbaar, beschermd) aan de leden in de basisklasse aan de afgeleide klasse. Als er geen toegangsspecificatie aanwezig is, wordt deze standaard beschouwd als "privé". Als de afgeleide klasse in C ++ "struct" is, is de toegangsspecificatie standaard "openbaar".
In C ++ kan overerving in vijf vormen worden bereikt. Ze kunnen worden geclassificeerd als: -
- Enkele overerving (slechts één superklasse)
- Multiple Inheritance (verschillende superklassen)
- Hiërarchische overerving (één superklasse, veel subklassen)
- Multiple Inheritance (afgeleid van een afgeleide klasse)
In Java neemt de klasse de andere klasse over door het sleutelwoord "uitbreiden" te gebruiken. In Java wordt de basisklasse aangeduid als een superklasse en wordt afgeleide klasse een subklasse genoemd. Een subklasse heeft geen toegang tot die leden van de basisklasse, die als "privé" worden verklaard. De algemene vorm die de klasse in Java erven is als volgt.
class derived-class-naam breidt base-class-naam uit {// body of the class};
Java ondersteunt de overerving van meerdere overerving niet, terwijl het de hiërarchie op meerdere niveaus ondersteunt. In Java wil een superklasse soms de implementatiedetails verbergen en maakt een deel van die gegevens 'privé'. Net als in Java, heeft een subklasse geen toegang tot de private leden van de superklasse en als een subklasse deze leden wil benaderen of initialiseren, biedt Java een oplossing. De subklasse kan de leden van zijn directe superklasse doorverwijzen met een sleutelwoord "super". Onthoud dat je alleen toegang hebt tot de leden van de directe superklasse.
De 'super' heeft twee algemene vormen. De eerste is, het gebruikt om de constructeur van superklasse te bellen. De tweede is om toegang te krijgen tot het lid van de superklasse dat is verborgen door het lid van de subklasse.
// eerste vorm van bellen met de constructor. class supper_class {supper_class (argument_list) {..} // constructor van superklasse}; class sub_class extends supper_class {sub_class (argument_list) {..} // constructor van subklasse super (argument_list); // sub_class roept de constructor van superklasse aan}};
// tweede voor van 'super' klasse supper_class {int i; } class sub_class extends supper_class {int i; sub_class (int a, int b) {super.i = a; // 'i' van superklasse i = b; // 'i' van subklasse}};
Definitie van polymorfisme
De term polymorfisme betekent eenvoudigweg 'één functie, meerdere vormen'. Polymorfisme wordt bereikt tijdens compile time en run time. Het compilatietijd polymorfisme wordt bereikt door "overbelasting", terwijl het looptijdpolymorfisme wordt bereikt door "overheersend".
Het polymorfisme stelt het object in staat om te beslissen "welke vorm van de functie die moet worden opgeroepen" bij zowel compileertijd als uitvoeringstijd.
Laten we het eerste concept van overbelasting bespreken. Bij overbelasting definiëren we een functie in de klas meer dan eens met een ander gegevenstype en het aantal parameters, terwijl de functie die moet worden overladen hetzelfde retourtype moet hebben. Meestal zijn de functies van de overbelaste constructeurs van de klasse.
klasse overbelasting {int a, b; public: int overload (int x) {// eerste overbelasting () constructor a = x; terug een; } int overbelasting (int x, int y) {// tweede overbelasting () constructor a = x; b = y; retourneer a * b; }}; int main () {overload O1; O1.overload (20); // eerste overload () constructor oproep O1.overload (20, 40); // tweede overbelastings () constructoroproep}
Laten we het nu eens hebben over de tweede vorm van polymorfisme, dwz overheersend. Het concept van overkoepelen kan alleen worden geïmplementeerd in de functie van de klassen die ook het concept van overerving implementeren. In C ++ wordt de functie die moet worden opgeheven voorafgegaan door het sleutelwoord "virtueel" in de basisklasse en opnieuw gedefinieerd in de afgeleide klasse met hetzelfde prototype, behalve het sleutelwoord "virtueel".
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 coutBelangrijkste verschillen tussen overerving en polymorfisme
- Overname is een klasse maken die zijn functie ontleent aan een reeds bestaande klasse. Aan de andere kant is polymorfisme een interface die in meerdere vormen kan worden gedefinieerd.
- Overerving wordt geïmplementeerd op de klassen, terwijl het polymorfisme wordt geïmplementeerd op methoden / functies.
- Omdat overerving ervoor zorgt dat een afgeleide klasse de elementen en methoden gebruikt die zijn gedefinieerd in de basisklasse, hoeft de afgeleide klasse deze elementen niet te definiëren of opnieuw te bewerken, dus we kunnen zeggen dat het de code-herbruikbaarheid vergroot en dus de lengte van de code verkort . Aan de andere kant maakt polymorfisme het mogelijk voor een object om te beslissen welke vorm van de methode het wil aanroepen tijdens compilatie en uitvoering.
- De overerving kan worden geclassificeerd als single inheritance, multiple inheritance, multlevel inheritance, hierarchical inheritance en hybrid inheritance. Aan de andere kant wordt polymorfisme geclassificeerd als overbelasting en overheersing.
Conclusie:
De overerving en het polymorfisme zijn onderling verwante concepten, aangezien het dynamische polymorfisme van toepassing is op de klassen die ook het concept van overerving implementeren.