I denne vejledning lærer vi om arv i C ++ ved hjælp af eksempler.
Arv er en af nøglefunktionerne i Objektorienteret programmering i C ++. Det giver os mulighed for at oprette en ny klasse (afledt klasse) fra en eksisterende klasse (basisklasse).
Den afledte klasse arver funktionerne fra basisklassen og kan have sine egne yderligere funktioner. For eksempel,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Her Dog
stammer Animal
klassen fra klassen. Siden Dog
er afledt af Animal
, er medlemmer af Animal
tilgængelige for Dog
.
![](https://cdn.wiki-base.com/8141271/c_inheritance.png.webp)
Bemærk brugen af nøgleordet, public
mens du arver hund fra dyr.
class Dog : public Animal (… );
Vi kan også bruge nøgleordene private
og i protected
stedet for public
. Vi vil lære om forskellene mellem at bruge private
, public
og protected
senere i denne tutorial.
er-et forhold
Arv er et is-a forhold . Vi bruger kun arv, hvis der er et forhold mellem de to klasser.
Her er nogle eksempler:
- En bil er et køretøj.
- Orange er en frugt.
- En kirurg er læge.
- En hund er et dyr.
Eksempel 1: Enkelt eksempel på C ++ arv
// 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; )
Produktion
Jeg kan spise! Jeg kan sove! Jeg kan gø! Woof woof !!
Her kan dog1 (objektet for afledt klasse Dog
) få adgang til medlemmer af basisklassen Animal
. Det er fordi Dog
det arves fra Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
C ++ beskyttede medlemmer
Adgangsmodifikatoren protected
er især relevant, når det kommer til C ++ arv.
Ligesom private
medlemmer er protected
medlemmer utilgængelige uden for klassen. Der er dog adgang til dem med afledte klasser og vensklasser / -funktioner .
Vi har brug for protected
medlemmer, hvis vi vil skjule dataene for en klasse, men stadig ønsker, at dataene nedarves af dens afledte klasser.
For at lære mere om beskyttet henvises til vores C ++ Access Modifiers tutorial.
Eksempel 2: C ++ - beskyttede medlemmer
// 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; )
Produktion
Jeg kan spise! Jeg kan sove! Jeg kan gø! Woof woof !! Jeg er et pattedyr. Min farve er sort
Her er variabeltypen protected
og er således tilgængelig fra den afledte klasse Dog
. Vi kan se dette, som vi har initialiseret type
i Dog
klassen ved hjælp af funktionen setType()
.
På den anden side kan den private
variable farve ikke initialiseres i Dog
.
class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );
Da protected
nøgleordet skjuler data, kan vi heller ikke få adgang til typen direkte fra et objekt Dog
eller en Animal
klasse.
// Error: member "Animal::type" is inaccessible dog1.type = "mammal";
Adgangstilstande i C ++ arv
I vores tidligere tutorials har vi lært om C ++ adgangsspecifikatorer såsom offentlige, private og beskyttede.
Indtil videre har vi brugt public
nøgleordet for at arve en klasse fra en tidligere eksisterende basisklasse. Men vi kan også bruge private
og protected
nøgleord til at arve klasser. For eksempel,
class Animal ( // code ); class Dog : private Animal ( // code );
class Cat : protected Animal ( // code );
De forskellige måder, vi kan udlede klasser på, kaldes adgangstilstande . Disse adgangstilstande har følgende effekt:
- offentlig: Hvis en afledt klasse erklæres i
public
tilstand, arves medlemmerne af baseklassen af den afledte klasse, ligesom de er. - privat: I dette tilfælde bliver alle medlemmer af basisklassen
private
medlemmer i den afledte klasse. - beskyttet: De
public
medlemmer af basen klassen bliverprotected
medlemmer i den afledte klasse.
De private
medlemmer af basen klassen er altid private
i den afledte klasse.
For at lære mere, besøg vores C ++ offentlige, private, beskyttede arvevejledning.
Medlem Funktion Tilsidesættelse af arv
Antag, baseklasse og afledt klasse har medlemsfunktioner med samme navn og argumenter.
Hvis vi opretter et objekt fra den afledte klasse og forsøger at få adgang til denne medlemsfunktion, kaldes medlemsfunktionen i den afledte klasse i stedet for den i basisklassen.
Medlemfunktionen for afledt klasse tilsidesætter baseformens medlemsfunktion.
Lær mere om funktionsoverstyring i C ++.
Anbefalet læsning: C ++ flere arv