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 Dog
klasa jest pochodną Animal
klasy. Ponieważ Dog
pochodzi od Animal
, członkowie Animal
są dostępni dla Dog
.

Zwróć uwagę na użycie słowa kluczowego public
podczas dziedziczenia Dog po Animal.
class Dog : public Animal (… );
Możemy również użyć słów kluczowych private
i protected
zamiast public
. Dowiemy się o różnicach między używaniem private
, public
a protected
póź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 Dog
jest dziedziczony z Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
Chronione elementy członkowskie C ++
Modyfikator dostępu protected
jest szczególnie istotny, jeśli chodzi o dziedziczenie w C ++.
Podobnie jak private
członkowie, protected
członkowie są niedostępni poza klasą. Dostęp do nich można jednak uzyskać za pomocą klas pochodnych i klas / funkcji zaprzyjaźnionych .
Potrzebujemy protected
czł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 protected
i dlatego jest dostępny z klasy pochodnej Dog
. Widzimy to, gdy zainicjowaliśmy type
w Dog
klasie przy użyciu funkcji setType()
.
Z drugiej strony, private
zmiennego 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ż protected
słowo kluczowe ukrywa dane, nie możemy uzyskać dostępu do typu bezpośrednio z obiektu Dog
lub Animal
klasy.
// 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 public
sł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 private
i 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:
- public: Jeśli klasa pochodna jest zadeklarowana w
public
trybie, elementy członkowskie klasy bazowej są dziedziczone przez klasę pochodną, tak jak są. - private: w tym przypadku wszyscy członkowie klasy bazowej stają się
private
członkami w klasie pochodnej. - chronione: The
public
członkowie klasy bazowej stająprotected
członków w klasie pochodnej.
Elementy private
członkowskie klasy bazowej są zawsze private
w 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 ++