Наследование C ++

В этом руководстве мы узнаем о наследовании в C ++ с помощью примеров.

Наследование - одна из ключевых особенностей объектно-ориентированного программирования на C ++. Это позволяет нам создать новый класс (производный класс) из существующего класса (базовый класс).

Производный класс наследует функции от базового класса и может иметь собственные дополнительные функции. Например,

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

Здесь Dogкласс является производным от Animalкласса. Поскольку Dogявляется производным от Animal, члены Animalдоступны для Dog.

Наследование в C ++

Обратите внимание на использование ключевого слова publicпри наследовании Dog от Animal.

 class Dog : public Animal (… );

Мы также можем использовать ключевые слова privateи protectedвместо public. Мы узнаем о различиях между использованием private, publicа protectedпозже в этом руководстве.

это отношения

Наследование - это отношения . Мы используем наследование только в том случае, если между двумя классами существует связь « есть-а».

Вот некоторые примеры:

  • Автомобиль - это средство передвижения.
  • Апельсин - это фрукт.
  • Хирург - это врач.
  • Собака - это животное.

Пример 1: Простой пример наследования 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; )

Вывод

Я могу есть! Я могу спать! Я умею лаять! Гав гав!!

Здесь dog1 (объект производного класса Dog) может обращаться к членам базового класса Animal. Это потому, что Dogунаследовано от Animal.

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

Члены, защищенные C ++

Модификатор доступа protectedособенно актуален, когда речь идет о наследовании C ++.

Как и privateчлены, protectedчлены недоступны вне класса. Однако к ним могут обращаться производные классы и дружественные классы / функции .

Нам нужны protectedчлены, если мы хотим скрыть данные класса, но все же хотим, чтобы эти данные унаследовались его производными классами.

Чтобы узнать больше о protected, обратитесь к нашему руководству C ++ Access Modifiers.

Пример 2: члены, защищенные 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; )

Вывод

Я могу есть! Я могу спать! Я умею лаять! Гав гав!! Я млекопитающее, мой цвет черный

Здесь тип переменной protectedдоступен и поэтому доступен из производного класса Dog. Мы можем увидеть это , как мы инициализируемся typeв Dogклассе с помощью функции setType().

С другой стороны, privateпеременный цвет не может быть инициализирован Dog.

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

Кроме того, поскольку protectedключевое слово скрывает данные, мы не можем получить доступ к типу напрямую из объекта Dogили Animalкласса.

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

Режимы доступа в наследовании C ++

В наших предыдущих руководствах мы узнали о спецификаторах доступа C ++, таких как общедоступный, частный и защищенный.

До сих пор мы использовали publicключевое слово для наследования класса от ранее существовавшего базового класса. Тем не менее, мы можем также использовать privateи protectedключевые слова , чтобы наследовать классы. Например,

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

Различные способы получения классов известны как режимы доступа . Эти режимы доступа имеют следующий эффект:

  1. public: если производный класс объявлен в publicрежиме, то члены базового класса наследуются производным классом, как и они.
  2. private: в этом случае все члены базового класса становятся privateчленами производного класса.
  3. защищенный: В publicчлены базового класса становятся protectedчленами в производном классе.

В privateчлены базового класса всегда privateв производном классе.

Чтобы узнать больше, посетите наш учебник по общедоступному, частному, защищенному наследованию C ++.

Переопределение функции-члена при наследовании

Предположим, базовый класс и производный класс имеют функции-члены с одинаковыми именами и аргументами.

Если мы создаем объект производного класса и пытаемся получить доступ к этой функции-члену, функция-член в производном классе вызывается вместо функции в базовом классе.

Функция-член производного класса переопределяет функцию-член базового класса.

Узнайте больше о переопределении функций в C ++.

Рекомендуемая литература: множественное наследование в C ++

Интересные статьи...