Наследование — ключевая концепция объектно-ориентированного программирования в C++, позволяющая создавать новые классы (классы-наследники) на основе существующих (классы-родители). Класс-родитель определяет общий базовый функционал, наследуемый классом-наследником, который может добавлять свою специфическую функциональность. Это способствует созданию более структурированного и рационального кода.
Практическое применение: пример с классами компьютеров
Рассмотрим пример: создание классов для описания различных типов компьютеров. Создадим базовый класс PC, описывающий общие характеристики:
class PC {
public:
double diagonal;
std::string os;
PC(double diagonal, std::string os) : diagonal(diagonal), os(os) {}
};
Класс содержит поля diagonal (диагональ экрана) и os (операционная система). Конструктор инициализирует эти поля. Для демонстрации наследования достаточно этих двух полей, хотя можно добавить больше.
Использование только класса PC проблематично, так как разные типы компьютеров (ноутбуки, суперкомпьютеры, квантовые компьютеры) имеют уникальные характеристики. Объединение всех характеристик в одном классе приведёт к неэффективному и сложному коду. Решение — использовать наследование. Создадим классы-наследники от PC, каждый из которых будет добавлять специфические характеристики.
Наследование и переопределение методов
Создадим класс Laptop, наследующий характеристики от PC и добавляющий вес:
class Laptop : public PC {
public:
double weight;
Laptop(double diagonal, std::string os, double weight) : PC(diagonal, os), weight(weight) {}
};
Синтаксис наследования: : public PC. Класс Laptop публично наследует все публичные и защищённые (protected) члены класса PC. Приватные (private) члены родительского класса недоступны классу-наследнику.
Конструктор Laptop принимает три параметра: диагональ, операционную систему и вес. PC(diagonal, os) в списке инициализации вызывает конструктор родительского класса для инициализации унаследованных полей.
Пример создания объекта:
Laptop macbook(16, "macOS", 1.5);
Добавим в класс PC метод getInfo(), выводящий информацию об операционной системе и диагонали экрана:
void getInfo() {
std::cout << "OS: " << os << std::endl;
std::cout << "Diagonal: " << diagonal << std::endl;
}
В Laptop переопределим getInfo(), добавив вывод информации о весе:
void getInfo() {
PC::getInfo(); // Вызов метода getInfo() из родительского класса
std::cout << "Weight: " << weight << std::endl;
}
PC::getInfo() вызывает метод getInfo() из класса PC. Сначала выполнится метод из PC, затем добавится вывод веса из Laptop.
Модификатор доступа protected
Модификатор доступа protected предоставляет доступ к членам класса внутри самого класса и внутри классов-наследников, но не извне. Заменим private на protected в классе PC:
class PC {
protected:
double diagonal;
std::string os;
// ...
};
Теперь к полям diagonal и os можно обращаться из класса Laptop, но не напрямую через объект класса PC.
Наследование — мощный инструмент для создания иерархий классов, способствующий структурированию и повторному использованию кода. Понимание принципов наследования и модификаторов доступа необходимо для разработки эффективных и масштабируемых программ на C++.