In deze tutorial leren we met behulp van voorbeelden over overerving in C ++.
Overerving is een van de belangrijkste kenmerken van objectgeoriënteerd programmeren in C ++. Het stelt ons in staat om een nieuwe klasse (afgeleide klasse) te maken van een bestaande klasse (basisklasse).
De afgeleide klasse neemt de kenmerken over van de basisklasse en kan zelf aanvullende kenmerken hebben. Bijvoorbeeld,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Hier wordt de Dog
klasse afgeleid van de Animal
klasse. Omdat Dog
is afgeleid van Animal
, zijn leden Animal
toegankelijk voor Dog
.

Let op het gebruik van het trefwoord public
bij het erven van Dog van Animal.
class Dog : public Animal (… );
We kunnen ook de trefwoorden private
en gebruiken in protected
plaats van public
. We zullen leren over de verschillen tussen het gebruik private
, public
en protected
later in deze tutorial.
is een relatie
Overerving is een is-een relatie . We gebruiken overerving alleen als er een is-a-relatie aanwezig is tussen de twee klassen.
Hier zijn enkele voorbeelden:
- Een auto is een voertuig.
- Oranje is een vrucht.
- Een chirurg is een dokter.
- Een hond is een dier.
Voorbeeld 1: eenvoudig voorbeeld van C ++ Inheritance
// C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )
Uitvoer
Ik kan eten! Ik kan slapen! Ik kan blaffen! Woef woef!!
Hier heeft dog1 (het object van de afgeleide klasse Dog
) toegang tot leden van de basisklasse Animal
. Het is omdat het Dog
wordt geërfd van Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
C ++ beschermde leden
De toegangsmodificator protected
is vooral relevant als het gaat om overerving van C ++.
Net als private
leden zijn protected
leden niet toegankelijk buiten de klas. Ze zijn echter toegankelijk via afgeleide klassen en vriendenklassen / -functies .
We hebben protected
leden nodig als we de gegevens van een klasse willen verbergen, maar toch willen dat die gegevens worden overgenomen door de daarvan afgeleide klassen.
Raadpleeg onze zelfstudie over C ++ Access Modifiers voor meer informatie over beschermd.
Voorbeeld 2: C ++ beschermde leden
// C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )
Uitvoer
Ik kan eten! Ik kan slapen! Ik kan blaffen! Woef woef!! Ik ben een zoogdier. Mijn kleur is zwart
Hier is protected
en is het type variabele toegankelijk vanuit de afgeleide klasse Dog
. We kunnen dit zien zoals we type
in de Dog
klas hebben geïnitialiseerd met behulp van de functie setType()
.
Aan de andere kant kan de private
variabele kleur niet worden geïnitialiseerd in Dog
.
class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );
Omdat het protected
trefwoord gegevens verbergt, hebben we ook geen directe toegang tot het type vanuit een object Dog
of Animal
klasse.
// Error: member "Animal::type" is inaccessible dog1.type = "mammal";
Toegangsmodi in C ++ Inheritance
In onze vorige tutorials hebben we geleerd over C ++ -toegangsspecificaties zoals openbaar, privé en beschermd.
Tot dusver hebben we het public
sleutelwoord gebruikt om een klasse over te nemen van een eerder bestaande basisklasse. We kunnen echter ook de private
en protected
sleutelwoorden gebruiken om klassen over te nemen. Bijvoorbeeld,
class Animal ( // code ); class Dog : private Animal ( // code );
class Cat : protected Animal ( // code );
De verschillende manieren waarop we klassen kunnen afleiden, staan bekend als toegangsmodi . Deze toegangsmodi hebben het volgende effect:
- public: als een afgeleide klasse wordt gedeclareerd in
public
modus, worden de leden van de basisklasse overgenomen door de afgeleide klasse, net zoals ze zijn. - privé: in dit geval worden alle leden van de basisklasse
private
lid van de afgeleide klasse. - protected: de
public
leden van de basisklasse wordenprotected
lid in de afgeleide klasse.
De private
leden van de basisklasse bevinden zich altijd private
in de afgeleide klasse.
Ga voor meer informatie naar onze C ++ openbare, privé, beschermde overerving-tutorial.
Functie van lid overschrijven bij overerving
Stel dat basisklasse en afgeleide klasse lidfuncties hebben met dezelfde naam en argumenten.
Als we een object van de afgeleide klasse maken en proberen toegang te krijgen tot die lidfunctie, wordt de lidfunctie in de afgeleide klasse aangeroepen in plaats van die in de basisklasse.
De lidfunctie van de afgeleide klasse overschrijft de lidfunctie van de basisklasse.
Meer informatie over het overschrijven van functies in C ++.
Aanbevolen literatuur: C ++ meervoudige overerving