В этом руководстве мы узнаем о наследовании в 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 );
Различные способы получения классов известны как режимы доступа . Эти режимы доступа имеют следующий эффект:
- public: если производный класс объявлен в
publicрежиме, то члены базового класса наследуются производным классом, как и они. - private: в этом случае все члены базового класса становятся
privateчленами производного класса. - защищенный: В
publicчлены базового класса становятсяprotectedчленами в производном классе.
В privateчлены базового класса всегда privateв производном классе.
Чтобы узнать больше, посетите наш учебник по общедоступному, частному, защищенному наследованию C ++.
Переопределение функции-члена при наследовании
Предположим, базовый класс и производный класс имеют функции-члены с одинаковыми именами и аргументами.
Если мы создаем объект производного класса и пытаемся получить доступ к этой функции-члену, функция-член в производном классе вызывается вместо функции в базовом классе.
Функция-член производного класса переопределяет функцию-член базового класса.
Узнайте больше о переопределении функций в C ++.
Рекомендуемая литература: множественное наследование в C ++








