Типы наследования в C++ Что нужно знать?

Опубликовано: 2023-04-05

Вы когда-нибудь задумывались, как строятся некоторые популярные программные системы? Все это благодаря мощному механизму, называемому наследованием в объектно-ориентированном программировании (ООП). Наследование позволяет программистам создавать новые классы на базе существующих, что позволяет повторно использовать код и эффективно разрабатывать программное обеспечение. Представьте, что вы строите систему, для которой требуется несколько классов, каждый из которых имеет некоторые общие атрибуты и поведение.

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

Наследование не только эффективно, но и универсально. В C++ существует несколько типов наследования, каждый со своими уникальными преимуществами и вариантами использования.

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

Оглавление

Различные типы наследования в C++

Язык программирования C++ предлагает своим программистам пять различных вариантов наследования. В зависимости от контекста и требований разработчики и программисты могут работать с любым из этих типов наследования.

Единое наследство

Одиночное наследование является наиболее распространенным типом наследования в C++. При одиночном наследовании производный класс наследуется от одного базового класса. Это означает, что класс наследует все общедоступные и защищенные данные-члены и функции-члены базового класса, имея при этом возможность добавлять свои собственные данные-члены и функции-члены.

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

// Базовый класс

класс животных {

публичный:

недействительно есть () {

std::cout << «Животное ест» << std::endl;

}

};

// Производный класс

класс Собака: общественное животное {

публичный:

пустая кора () {

std::cout << «Собака лает» << std::endl;

}

};

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

Когда использовать одиночное наследование в C++

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

Например, вы можете использовать одиночное наследование при создании игры с участием разных персонажей, таких как воины, маги и лучники. Все эти персонажи имеют некоторые общие атрибуты и поведение, такие как очки здоровья, сила атаки и скорость передвижения. Используя одиночное наследование, вы можете создать базовый класс под названием «Символ», который содержит общие атрибуты и поведение, и наследовать от него каждый класс символов, чтобы добавить их уникальные функции.

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

Вот пример множественного наследования:

// Базовый класс 1

форма класса {

публичный:

виртуальная двойная область() = 0;

};

// Базовый класс 2

класс Цвет {

публичный:

виртуальный std::string getColor() = 0;

};

// Производный класс

Класс Rectangle: общедоступная форма, общедоступный цвет {

публичный:

двойная область () переопределить {

возвращаемая ширина * высота;

}

std::string getColor() переопределить {

вернуть цвет;

}

частный:

двойная ширина = 5,0;

двойная высота = 3,0;

std::string color = «синий»;

};

В этом примере у нас есть два базовых класса, Shape и Color , каждый со своей виртуальной функцией.Затем мы определяем производный классRectangle , который наследуется как от Shape, так и от Color.Rectangle переопределяет виртуальные функции обоих базовых классов, обеспечивая собственную реализацию. Используя множественное наследование,Rectangle может наследовать свойства обоих базовых классов, ShapeиColor, для создания прямоугольника с определенным цветом и площадью.

Когда использовать множественное наследование в C++

Используйте множественное наследование, если хотите объединить функциональность нескольких базовых классов. Например, рассмотрим приложение с графическим интерфейсом, которое требует различных типов элементов управления, таких как кнопки, флажки и текстовые поля. Каждый тип элемента управления имеет свою функциональность и поведение, но они также имеют некоторые общие функции, такие как обработка пользовательских событий и отображение текста.

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

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

Вот фрагмент кода, который поможет вам понять реализацию иерархического наследования в C++:

// Базовый класс

класс животных {

публичный:

виртуальная пустота makeSound() = 0;

};

// Производный класс 1

класс Кошка: общественное животное {

публичный:

недействительным makeSound() переопределить {

std::cout << "Мяу" << std::endl;

}

};

// Производный класс 2

класс Собака: общественное животное {

публичный:

недействительным makeSound() переопределить {

std::cout << "Гав" << std::endl;

}

};

В этом примере у нас есть базовый класс Animal с виртуальной функцией makeSound().Затем мы определяем два производных класса,Cat и Dog, которые наследуются отAnimal. Каждый производный класс переопределяет функциюmakeSound() , предоставляя собственную реализацию.Используя иерархическое наследование, мы можем создавать разные типы животных, которые имеют общие черты поведения, например издают звуки.

Когда использовать иерархическое наследование в C++

Используйте иерархическое наследование, если вы хотите создать несколько производных классов с общими функциями. Например, рассмотрим банковское приложение, для которого требуются разные типы счетов, такие как сберегательные счета, расчетные счета и счета кредитных карт. Все эти типы счетов имеют некоторые общие атрибуты и поведение, такие как номер счета, баланс и процентная ставка.

Используя иерархическое наследование, вы можете создать базовый класс с именем Account, содержащий общие атрибуты и поведение, и получить от него каждый тип учетной записи, чтобы добавить его уникальные функции.

Многоуровневое наследование

Многоуровневое наследование в C++ — это тип наследования, при котором производный класс наследуется другим производным классом. В этом сценарии производный класс наследует все общедоступные и защищенные данные-члены и функции-члены своего непосредственного родительского класса, который, в свою очередь, наследуется от своего собственного родительского класса и так далее.

Вот как вы можете программно реализовать многоуровневое наследование в C++:

// Базовый класс

класс транспортного средства {

публичный:

недействительный старт () {

std::cout << "Автомобиль заводится" << std::endl;

}

};

// Промежуточный класс

класс автомобиля: общественное транспортное средство {

публичный:

пустой диск () {

std::cout << "Машина едет" << std::endl;

}

};

// Производный класс

класс SportsCar: общественный автомобиль {

публичный:

недействительное ускорение () {

std::cout << "Спорткар разгоняется" << std::endl;

}

};

Когда использовать многоуровневое наследование в C++

Используйте многоуровневое наследование, если вы хотите создать производный класс, который наследуется от другого производного класса и добавляет его функциональные возможности. Например, рассмотрим программную систему, для которой требуются различные типы транспортных средств, таких как легковые автомобили, грузовики и мотоциклы. Эти типы транспортных средств имеют некоторые общие характеристики и поведение, такие как скорость, ускорение и торможение.

Используя многоуровневое наследование, вы можете создать базовый класс с именем Vehicle , который содержит общие атрибуты и поведение, и вывести из него промежуточные классы, такие как CarиTruck, чтобы добавить их специфические функции. Затем вы можете получитькласс SportsCar от класса Car, чтобы добавить его уникальную функциональность.

Гибридное наследование представляет собой комбинацию двух или более типов наследования. Также называемый виртуальным наследованием, производный класс в гибридном наследовании наследует от нескольких базовых классов, некоторые из которых наследуются несколькими путями. Это может создать сложную иерархию наследования, которую сложно понять и поддерживать.

Посетитекурсы по разработке программного обеспечения upGrad, чтобы повысить свою квалификацию.

Вот пример гибридного наследования в C++:

// Базовый класс 1

класс животных {

публичный:

виртуальная пустота makeSound() = 0;

};

// Базовый класс 2

класс может летать {

публичный:

виртуальная пустота fly() = 0;

};

// Базовый класс 3

класс CanSwim {

публичный:

виртуальная пустота плавать() = 0;

};

// Производный класс

класс Летучая мышь: общедоступное животное, общедоступное CanFly {

публичный:

недействительным makeSound() переопределить {

std::cout << «Визг!»<< стд::эндл;

}

пустота fly () переопределить {

std::cout << "Летучая мышь летит" << std::endl;

}

};

// Производный класс

класс Penguin: общедоступное животное, общедоступное CanSwim {

публичный:

недействительным makeSound() переопределить {

std::cout << «Ура!»<< стд::эндл;

}

недействительным плавать () переопределить {

std::cout << «Пингвин плывет» << std::endl;

}

};

Изучите наши популярные курсы по программной инженерии

Магистр компьютерных наук LJMU и IIITB Программа сертификатов кибербезопасности Caltech CTME
Учебный курс по полной разработке стека Программа PG в блокчейне
Программа Executive PG в Full Stack Development
Посмотреть все наши курсы ниже
Курсы по разработке программного обеспечения

Когда использовать гибридное наследование в C++

В дополнение к четырем типам наследования, рассмотренным ранее, гибридное наследование может быть полезно в определенных сценариях, где требуется несколько типов наследования. Используйте гибридное наследование, чтобы объединить преимущества нескольких типов наследования.

Например, рассмотрим программную систему, для которой требуются разные типы животных, некоторые из которых умеют летать, а другие умеют плавать. Вы можете использовать гибридное наследование для создания базового класса с именем Animal и производных от него двух промежуточных классов, CanFlyиCanSwim. Наконец, используя гибридное наследование, вы можете получить классыBat и Penguinиз обоих промежуточных классов. Класс Bat наследуется отAnimal и CanFly, аклассPenguin наследуется отAnimalиCanSwim. Таким образом, вы можете создавать разные виды животных с уникальными комбинациями способностей.

Гибридное наследование в C++ может быть полезно в сложных программных системах, где требуется несколько типов наследования. Однако он также может создавать сложные иерархии наследования, которые сложно понять и поддерживать. Как и в случае с другими типами наследования, выбор правильного типа для ваших конкретных требований проекта разработки программного обеспечения и целей проектирования имеет решающее значение.

Прочтите наши популярные статьи, связанные с разработкой программного обеспечения

Ознакомьтесь с нашимибесплатными технологическими курсами , чтобы получить преимущество над конкурентами.

Важные вещи, о которых следует помнить при использовании наследования:

Хотя наследование является мощным механизмом в C++, при его реализации необходимо учитывать несколько факторов.

  1. Избегайте глубоких иерархий наследования . Глубокие иерархии наследования могут привести к тому, что код будет трудно читать, понимать и поддерживать.Сохраняйте иерархию наследования как можно более мелкой, чтобы улучшить читаемость и удобство сопровождения кода.
  2. Используйте модификаторы доступа с умом. Модификаторы доступа (общедоступные, защищенные и частные) управляют видимостью членов данных и функций-членов в классе.Используйте их с умом, чтобы не раскрывать детали реализации, которые не должны быть видны за пределами класса.
  3. Избегайте алмазного наследования: алмазное наследование происходит, когда класс наследуется от двух классов, которые наследуются от одного и того же базового класса.Это может привести к двусмысленности, и обычно этого лучше избегать.
  4. Избегайте чрезмерного использования наследования. Хотя наследование может быть полезным, важно избегать его чрезмерного использования.В некоторых случаях лучшим выбором может быть композиция или другие шаблоны проектирования.

Изучите наши бесплатные курсы по разработке программного обеспечения

Основы облачных вычислений Основы JavaScript с нуля Структуры данных и алгоритмы
Технология Блокчейн Реагировать для начинающих Основные основы Java
Джава Node.js для начинающих Расширенный JavaScript

Еда на вынос

Подводя итог, можно сказать, что наследование — ключевая концепция программирования на C++, которую должен освоить каждый студент, изучающий программирование. Понимая различные типы наследования и варианты их использования, вы можете создавать эффективный, организованный и удобный для сопровождения код, тем самым становясь лучшим разработчиком программного обеспечения.

Если эта статья показалась вам интересной, вы можете еще больше расширить свои знания в области разработки программного обеспечения, записавшись в программу сертификации upGrad DevOps , предлагаемую в сотрудничестве с IIIT Bangalore. Эта программа охватывает различные аспекты разработки программного обеспечения, включая кодирование, тестирование и развертывание, и может помочь вам стать опытным разработчиком программного обеспечения в отрасли.

Почему наследование важно в программировании на C++?

Благодаря использованию наследования программисты могут сэкономить время и силы при разработке программного обеспечения для организованного создания сложных программных систем. По мере того, как программисты работают над созданием более читаемых кодов, процесс кодирования упрощается во много раз.

Что важно помнить при использовании наследования в программировании на C++?

При использовании наследования в программировании на C++ важно помнить о некоторых важных вещах, таких как избегание глубоких иерархий наследования, разумное использование модификаторов доступа, избегание алмазного наследования и не злоупотребление наследованием.

Какой тип наследования следует использовать для моего проекта разработки программного обеспечения?

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