Menu
Coddy logo textTech

Основы наследования

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 48 из 104.

Наследование позволяет классу перенимать свойства и поведение другого класса. Класс, от которого происходит наследование, называется базовым классом (или родительским), а класс, который наследует, называется производным классом (или дочерним).

Для создания производного класса используйте двоеточие, за которым следует спецификатор доступа и имя базового класса:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

Класс Dog теперь имеет доступ как к name, так и к eat() из Animal, а также к своему собственному методу bark(). В этом и заключается суть наследования: повторное использование существующего кода при добавлении новой функциональности.

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // Унаследовано от Animal
myDog.bark();   // Определено в Dog

Ключевое слово public перед Animal определяет тип наследования. Публичное наследование означает, что публичные члены базового класса остаются публичными в производном классе. Это наиболее распространенная форма, которая моделирует отношение «является» (is-a): Dog является Animal.

challenge icon

Задание

Легко

Давайте создадим простую иерархию транспортных средств, которая демонстрирует наследование в действии. Вы создадите базовый класс Vehicle и производный класс Motorcycle, который расширяет его специализированным поведением.

Вы организуете свой код в трех файлах:

  • Vehicle.h: Определите базовый класс Vehicle с:
    • Публичным членом std::string brand
    • Публичным членом int year
    • Публичным методом displayInfo(), который выводит марку и год выпуска транспортного средства в формате: Brand: <brand>, Year: <year>
  • Motorcycle.h: Определите класс Motorcycle, который публично наследуется от Vehicle. Этот производный класс должен добавить:
    • Публичный член int engineCC для объема двигателя
    • Публичный метод revEngine(), который выводит: <brand> goes vroom vroom!

    Класс Motorcycle автоматически унаследует brand, year и displayInfo() от Vehicle.

  • main.cpp: Считайте три входных значения (каждое на отдельной строке):
    1. Название марки (строка)
    2. Год (целое число)
    3. Объем двигателя в СС (целое число)

    Создайте объект Motorcycle, установите его унаследованные члены (brand и year), а также его собственный член engineCC. Затем продемонстрируйте наследование, вызвав как унаследованный метод, так и метод, специфичный для мотоцикла.

    Формат вывода:

    Brand: <brand>, Year: <year>
    Engine: <engineCC>cc
    <brand> goes vroom vroom!

Например, при входных данных Harley, 2022 и 1200:

Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!

Не забудьте включить guard-заголовки в ваши заголовочные файлы и использовать #include "Vehicle.h" в заголовке Motorcycle для доступа к базовому классу.

Шпаргалка

Наследование позволяет классу приобретать свойства и поведение другого класса. Класс, от которого происходит наследование, называется базовым классом (родительским), а класс, который наследует, — производным классом (дочерним).

Чтобы создать производный класс, используйте двоеточие, за которым следует спецификатор доступа и имя базового класса:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

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

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // Унаследовано от Animal
myDog.bark();   // Определено в Dog

Ключевое слово public указывает на публичное наследование, что означает, что публичные члены базового класса остаются публичными в производном классе. Это моделирует отношение «является» (is-a).

Попробуйте сами

#include <iostream>
#include <string>
#include "Motorcycle.h"

using namespace std;

int main() {
    string brand;
    int year;
    int engineCC;

    cin >> brand;
    cin >> year;
    cin >> engineCC;

    // TODO: Создайте объект Motorcycle
    // TODO: Установите значения его полей brand, year и engineCC
    // TODO: Вызовите displayInfo(), чтобы показать унаследованную информацию
    // TODO: Выведите информацию о двигателе в формате: Engine: <engineCC>cc
    // TODO: Вызовите revEngine(), чтобы продемонстрировать специфическое поведение мотоцикла

    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование