C ++ Overerving

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 Dogklasse afgeleid van de Animalklasse. Omdat Dogis afgeleid van Animal, zijn leden Animaltoegankelijk voor Dog.

Overerving in C ++

Let op het gebruik van het trefwoord publicbij het erven van Dog van Animal.

 class Dog : public Animal (… );

We kunnen ook de trefwoorden privateen gebruiken in protectedplaats van public. We zullen leren over de verschillen tussen het gebruik private, publicen protectedlater 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 Dogwordt geërfd van Animal.

 // Calling members of the Animal class dog1.eat(); dog1.sleep();

C ++ beschermde leden

De toegangsmodificator protectedis vooral relevant als het gaat om overerving van C ++.

Net als privateleden zijn protectedleden niet toegankelijk buiten de klas. Ze zijn echter toegankelijk via afgeleide klassen en vriendenklassen / -functies .

We hebben protectedleden 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 protecteden is het type variabele toegankelijk vanuit de afgeleide klasse Dog. We kunnen dit zien zoals we typein de Dogklas hebben geïnitialiseerd met behulp van de functie setType().

Aan de andere kant kan de privatevariabele 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 protectedtrefwoord gegevens verbergt, hebben we ook geen directe toegang tot het type vanuit een object Dogof Animalklasse.

 // 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 publicsleutelwoord gebruikt om een ​​klasse over te nemen van een eerder bestaande basisklasse. We kunnen echter ook de privateen protectedsleutelwoorden 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:

  1. public: als een afgeleide klasse wordt gedeclareerd in publicmodus, worden de leden van de basisklasse overgenomen door de afgeleide klasse, net zoals ze zijn.
  2. privé: in dit geval worden alle leden van de basisklasse privatelid van de afgeleide klasse.
  3. protected: de publicleden van de basisklasse worden protectedlid in de afgeleide klasse.

De privateleden van de basisklasse bevinden zich altijd privatein 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

Interessante artikelen...