Dziedziczenie w C ++

W tym poradniku nauczymy się dziedziczenia w C ++ na przykładach.

Dziedziczenie jest jedną z kluczowych cech programowania obiektowego w C ++. Pozwala nam na stworzenie nowej klasy (klasy pochodnej) z istniejącej klasy (klasy bazowej).

Klasa pochodna dziedziczy funkcje z klasy bazowej i może mieć własne dodatkowe funkcje. Na przykład,

 class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );

Tutaj Dogklasa jest pochodną Animalklasy. Ponieważ Dogpochodzi od Animal, członkowie Animalsą dostępni dla Dog.

Dziedziczenie w C ++

Zwróć uwagę na użycie słowa kluczowego publicpodczas dziedziczenia Dog po Animal.

 class Dog : public Animal (… );

Możemy również użyć słów kluczowych privatei protectedzamiast public. Dowiemy się o różnicach między używaniem private, publica protectedpóźniej w tym samouczku.

jest-związkiem

Dziedziczenie jest związkiem . Dziedziczenia używamy tylko wtedy, gdy między dwiema klasami występuje relacja is -a .

Oto kilka przykładów:

  • Samochód to pojazd.
  • Pomarańcza to owoc.
  • Chirurg to lekarz.
  • Pies to zwierzę.

Przykład 1: Prosty przykład dziedziczenia w C ++

 // 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; )

Wynik

Mogę jeść! Mogę spać! Mogę szczekać! Hau hau !!

W tym przypadku dog1 (obiekt klasy pochodnej Dog) może uzyskać dostęp do elementów klasy bazowej Animal. To dlatego, że Dogjest dziedziczony z Animal.

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

Chronione elementy członkowskie C ++

Modyfikator dostępu protectedjest szczególnie istotny, jeśli chodzi o dziedziczenie w C ++.

Podobnie jak privateczłonkowie, protectedczłonkowie są niedostępni poza klasą. Dostęp do nich można jednak uzyskać za pomocą klas pochodnych i klas / funkcji zaprzyjaźnionych .

Potrzebujemy protectedczłonków, jeśli chcemy ukryć dane klasy, ale nadal chcemy, aby te dane były dziedziczone przez jej klasy pochodne.

Aby dowiedzieć się więcej o ochronie, zapoznaj się z naszym samouczkiem dotyczącym modyfikatorów dostępu w języku C ++.

Przykład 2: Członkowie chronieni w C ++

 // 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; )

Wynik

Mogę jeść! Mogę spać! Mogę szczekać! Hau hau !! Jestem ssakiem Mój kolor jest czarny

Tutaj typ zmiennej jest protectedi dlatego jest dostępny z klasy pochodnej Dog. Widzimy to, gdy zainicjowaliśmy typew Dogklasie przy użyciu funkcji setType().

Z drugiej strony, privatezmiennego koloru nie można zainicjować w Dog.

 class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );

Ponadto, ponieważ protectedsłowo kluczowe ukrywa dane, nie możemy uzyskać dostępu do typu bezpośrednio z obiektu Doglub Animalklasy.

 // Error: member "Animal::type" is inaccessible dog1.type = "mammal";

Tryby dostępu w dziedziczeniu w C ++

W naszych poprzednich samouczkach dowiedzieliśmy się o specyfikatorach dostępu C ++, takich jak publiczny, prywatny i chroniony.

Do tej pory używaliśmy publicsłowa kluczowego w celu dziedziczenia klasy z wcześniej istniejącej klasy bazowej. Jednak do dziedziczenia klas możemy również użyć słów kluczowych privatei protected. Na przykład,

 class Animal ( // code ); class Dog : private Animal ( // code );
 class Cat : protected Animal ( // code );

Różne sposoby wyprowadzania klas są znane jako tryby dostępu . Te tryby dostępu mają następujący efekt:

  1. public: Jeśli klasa pochodna jest zadeklarowana w publictrybie, elementy członkowskie klasy bazowej są dziedziczone przez klasę pochodną, ​​tak jak są.
  2. private: w tym przypadku wszyscy członkowie klasy bazowej stają się privateczłonkami w klasie pochodnej.
  3. chronione: The publicczłonkowie klasy bazowej stają protectedczłonków w klasie pochodnej.

Elementy privateczłonkowskie klasy bazowej są zawsze privatew klasie pochodnej.

Aby dowiedzieć się więcej, odwiedź nasz samouczek C ++ dotyczący dziedziczenia publicznego, prywatnego i chronionego.

Funkcja składowa przesłaniająca w dziedziczeniu

Załóżmy, że klasa bazowa i klasa pochodna mają funkcje składowe o tej samej nazwie i argumentach.

Jeśli utworzymy obiekt klasy pochodnej i spróbujemy uzyskać dostęp do tej funkcji składowej, wywoływana jest funkcja składowa w klasie pochodnej zamiast tej z klasy bazowej.

Funkcja składowa klasy pochodnej przesłania funkcję składową klasy bazowej.

Dowiedz się więcej o zastępowaniu funkcji w C ++.

Zalecana lektura: Dziedziczenie wielokrotne w C ++

Interesujące artykuły...