Полиморфизм против наследования: разница между полиморфизмом и наследованием [2022]
Опубликовано: 2021-01-05Полиморфизм и наследование — очень фундаментальные концепции объектно-ориентированного программирования. Добавление объектов в современные языки программирования значительно изменило то, как мы используем язык, и то, что мы можем с ним делать. В двух словах, объектно-ориентированное программирование — это набор методов, которые позволяют программисту использовать классы и, следовательно, создавать объекты на основе этих классов.
Он направлен на то, чтобы походить на объекты реального мира и упростить для программистов включение в свой код парадигмы, в которой они пишут свой код. По сути, существует четыре концепции объектно-ориентированного программирования, а именно наследование, абстракция, полиморфизм и инкапсуляция. Теперь каждую из идей, как упоминалось ранее, можно рассматривать как столпы, на которых стоит любой современный язык.
Возвращаясь к нашей теме полиморфизма, наследования и права летучей мыши, мы видим явную разницу между этими двумя понятиями. Наследование — это концепция, позволяющая повторно использовать код в той же или другой программе. Мы даже можем изменить поведение кода, оставив то, что нам нравится, и отбросив то, что бесполезно для задач, которые мы пытаемся выполнить. Наследование экономит много времени при разработке почти всего, что мы видим сегодня на наших цифровых дисплеях.
С другой стороны, полиморфизм отвечает за определение кода, который уже был написан, и за определение типа кода, который необходимо выполнить, на основе определенных параметров в режиме реального времени. Всем было бы полезно сначала подробно рассмотреть каждую из этих концепций, прежде чем переходить к обсуждению разницы между полиморфизмом и наследованием. Различия станут более заметными, как только мы узнаем, что именно подразумевается под наследованием и полиморфизмом.
Получите диплом инженера -программиста в лучших университетах мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.
Оглавление
Наследование
Было бы преступлением в парадигме программирования не считать наследование крайне важной концепцией ООП. К важности наследования никогда нельзя относиться легкомысленно, поскольку целью наследования является «повторное использование». Что делает наследование, как следует из названия, так это то, что оно позволяет расширить код, написанный в классе, в другой класс. Итак, в наследовании существует базовый класс; класс, в котором написан код, должен использоваться повторно.

Следующий класс, который мы создадим, должен быть унаследован от этого базового класса, чтобы использовать все функции и переменные, связанные с базовым классом. Всякий раз, когда класс принимает свойства другого класса (или наследует от другого класса), все члены, присутствующие в базовом классе, становятся членами этого нового производного класса.
Пример кода, приведенный ниже, покажет вам, как выглядит общая форма наследования. Здесь следует отметить одну ключевую вещь: точный синтаксис, который вам придется написать, чтобы включить наследование вашего кода, будет зависеть исключительно от выбранного вами языка программирования.
- имя-производного-класса-класса: спецификатор-доступа-имя-базового-класса{
- // тело производного класса
- }
В примере, показанном выше, некоторые вещи требуют небольшого пояснения. Слово «спецификатор доступа» означает способ, которым производный класс будет получать доступ к свойствам и методам базового класса. В целом существует три спецификатора доступа, каждый из которых имеет собственное значение (а именно, частный, общедоступный и защищенный) и свойства.
Опять же, в зависимости от выбранного вами языка, вам может понадобиться или не понадобиться использовать эти спецификаторы доступа. Итак, в мире C++, если вы наследуете, ничего не указывая по умолчанию, оно становится приватным. Однако, если вы наследуете структуру (обозначается ключевым словом struct), спецификатор доступа по умолчанию будет общедоступным, а не частным.
Читайте: Карьерные возможности в языке программирования R
C++ также дает вам множество вариантов выбора при наследовании. Вы найдете некоторые из них в списке ниже:
а. Иерархическое наследование: этот тип наследования следует правилу, что должен быть только один суперкласс, и от этого суперкласса должно быть много производных подклассов. Вы найдете пример ниже:
- // Базовый класс
- класс А
- {
- публичная пустота funA()
- {
- //
- }
- }
- //Производный класс
- класс Б: А
- {
- общественная пустота funB()
- {
- //
- }
- }
- //Производный класс
- класс С: А
- {
- общественная пустота funC()
- {
- //
- }
- }
- //Производный класс
- класс Д: С
- {
- общественная пустота funD()
- {
- //
- }
- }
- //Производный класс
- класс Е: С
- {
- публичная пустота funE()
- {
- //
- }
- }
- //Производный класс
- класс F: В
- {
- публичная пустота funF()
- {
- //
- }
- }
- //Производный класс
- класс Г: Б
- {
- общественная пустота funG()
- {
- //
- }
- }
б. Множественное наследование. Если вы выполняете множественное наследование, это будет означать, что у вас есть только один производный подкласс, который наследуется от нескольких суперклассов. Ниже вы найдете простой пример множественного наследования:
- // Базовый класс
- класс А
- {
- публичная пустота funA()
- {
- //
- }
- }
- // Базовый класс
- класс Б
- {
- общественная пустота funB()
- {
- //
- }
- }
- //Производный класс
- класс С: А, В
- {
- общественная пустота funC()
- {
- //
- }
- }
в. Одиночное наследование: это, пожалуй, самая простая форма наследования. Существует только один базовый класс и один производный класс. Ниже вы найдете пример:
- // Базовый класс
- класс А
- {
- публичная пустота funA()
- {
- //СДЕЛАТЬ:
- }
- }
- //Производный класс
- класс Б: А
- {
- общественная пустота funB()
- {
- //СДЕЛАТЬ:
- }
- }
Полиморфизм
Основное определение слова «полиморфизм» означает наличие множества форм. Это определение очень точно подходит для объяснения полиморфизма в контексте программирования. В этой парадигме полиморфизм принимает значение одной функции, но многих форм. Полиморфизм на самом деле происходит во время компиляции. Полиморфизм во время компиляции возможен только из-за концепции перегрузки, а во время выполнения функция переопределения делает полиморфизм реальностью. Давайте один за другим рассмотрим определение как перегрузки, так и переопределения.

Перегрузка требует, чтобы код, который вы пишете, или функция класса были написаны более одного раза с разными параметрами, но с одним и тем же типом возвращаемого значения. Это означает, что аргументы, которые вы передаете в функцию, могут быть разными, и просто глядя на окончательные значения, которые передаются в функцию во время выполнения, решается, какая форма функции должна быть вызвана. Как правило, мы видим, что конструктор класса является наиболее перегруженной функцией. Вся эта теория станет намного понятнее, и вам будет легче укоренить ее в уме с помощью примера.
- перегрузка класса {
- инт а, б;
- публичный:
- int перегрузка (int x){ // первый конструктор перегрузки()
- а=х;
- вернуть а;
- }
- int перегрузка (int x, int y){ //второй конструктор перегрузки()
- а=х;
- б=у;
- вернуть а*б;
- }
- };
- интервал основной () {
- перегрузка О1;
- О1. перегрузка (20); // первый вызов конструктора перегрузки()
- О1. перегрузка (20,40); // второй вызов конструктора перегрузки()
Здесь, в этом примере, мы видим перегрузку в действии. Посмотрите, как вызываются разные конструкторы в зависимости от того, является ли конечное значение объекта в скобках одним целым числом или двумя.
Далее давайте рассмотрим определение переопределения. Вы можете выполнять переопределение только тех конкретных функций, которые унаследованы. Да, наследование является ключевым моментом в обеспечении возможности переопределения функций. Если вы хотите написать функцию, а также переопределить ее, в C++ вам придется использовать ключевое слово virtual перед определением функции, а в производном классе, использующем то же имя для вашей функции, просто удалите ключевое слово virtual. Чтобы закрепить ваше понимание, вот пример:
- база класса {
- публичный:
- virtual void funct (){ // виртуальная функция базового класса
- cout<<“Это функция базового класса()”;
- }
- };
- производный класс1: общедоступная база{
- публичный:
- void funct (){ // виртуальная функция базового класса, переопределенная в производном1 классе
- cout<<“Это funct() производного1 класса”;
- }
- };
- основной ( )
- {
- основание *р, б;
- производный1 d1;
- *р=&б;
- р-> функция (); // вызов базового класса funct().
- *p=&d1;
- вернуть 0;
- }
Посмотрите, как ключевое слово виртуальный используется в базовом классе, а в производном классе такое же определение функции есть, только ключевое слово виртуальный отсутствует.
Некоторые существенные различия между полиморфизмом и наследованием:
- Наследование, по сути, создает класс, а затем другие классы в вашей программе получают свои функции из уже существующего базового класса. Однако полиморфизм — это интерфейс, и поскольку он является интерфейсом, он может принимать различные формы и формы.
- Наследование — это свойство, относящееся только к классам, тогда как полиморфизм распространяется на любой метод и/или функцию.
- Наследование позволяет производному классу использовать все функции и переменные, объявленные в базовом классе, без их повторного явного определения. Вот почему мы говорим, что наследование увеличивает возможность повторного использования кода и уменьшает длину кода, который нам пришлось бы писать, если бы наследование отсутствовало. Принимая во внимание, что полиморфизм позволяет одному и тому же имени функции иметь два очень разных кода. Таким образом, в некотором смысле, вместо того, чтобы уменьшать длину кода, который нам пришлось бы писать, полиморфизм расширяет его еще больше.
- Есть много форм, которые может принимать наследование; вы можете быть очень изобретательны с наследованием. Однако полиморфизм может быть достигнут только двумя способами, т. е. перегрузкой и переопределением. Вы все еще можете сойти с ума при использовании полиморфизма, но вы ограничены только двумя способами его реализации в вашем коде.
Обязательно к прочтению: обязательно к прочтению 47 вопросов и ответов из интервью OOPS для новичков и опытных
Полиморфизм против наследования: табличная дифференциация
В таблице ниже вы найдете четкую разницу между полиморфизмом и наследованием:

СРАВНИТЕЛЬНЫЕ ИЗМЕРЕНИЯ | НАСЛЕДОВАНИЕ | ПОЛИМОРФИЗМ |
Принципиальные различия между двумя | Смысл наследования заключается в создании новых классов, у которых есть свойства (функции и переменные существующих классов) | По сути, это платформа, которая позволяет писать код в разных формах. |
Различия в том, как они оба могут быть интегрированы в ваш код. | Только классы могут пользоваться реальным наследованием в коде. | Он может быть реализован и использован любыми функциями и/или методами во всем коде. |
Различия в способах их использования. | Это позволяет повторно использовать написанный код в той же или другой программе. Без этого в объектно-ориентированном программировании отсутствовала бы важная функция. | Это позволяет объявленному объекту принимать решение о том, какую форму функции следует вызывать. Есть два случая, когда это может быть решено. Во время выполнения это называется переопределением; во время компиляции это называется перегрузкой. |
Различные формы, которые они оба могут принимать | Существует множество форм, которые может принимать наследование. | Могут быть только две формы полиморфизма. В зависимости от времени в программе он меняется с перегрузки на переопределение. |
Базовый пример, демонстрирующий реализацию каждого из них. | Класс велосипедов может наследоваться от класса двухколесных транспортных средств, которые, в свою очередь, могут быть подклассом транспортных средств. | Класс bike может иметь метод с именем set_color(), который изменяет цвет велосипеда в зависимости от введенного вами названия цвета. |
Проверьте: Что такое приведение типов в Java | Понимание приведения типов для начинающих
Заключение
Можно с уверенностью сказать, что и полиморфизм, и наследование являются важными понятиями для воплощения любой программы в жизнь. Они оба являются основой, на которой была заложена идея объектно-ориентированного программирования. Есть много различий между полиморфизмом и наследованием, потому что они служат двум очень разным целям.
Полиморфизм позволяет программисту написать несколько определений функции. В то же время наследование позволяет пользователю повторно использовать уже написанный код. Чтобы полностью понять и оценить эти две концепции, рекомендуется дополнительно прочитать обе темы.
Одна вещь, которую вы всегда должны иметь в виду всякий раз, когда вы пишете код, заключается в том, что если вы хотите реорганизовать код, который вы уже написали (в основном определение одного класса и использовать его снова в вашем коде для обслуживания аналогичного или другого цель), вы должны использовать наследование. Если вы хотите уменьшить общую путаницу в своем коде и хотите использовать одно и то же имя функции для выполнения аналогичных задач, вам следует использовать полиморфизм.
Если вам интересно узнать больше о разработке программного обеспечения с полным стеком, ознакомьтесь с дипломом PG upGrad & IIIT-B по разработке программного обеспечения с полным стеком, который предназначен для работающих профессионалов и предлагает более 500 часов интенсивного обучения, более 9 проектов и задания, статус выпускника IIIT-B, практические практические проекты и помощь в трудоустройстве в ведущих фирмах.
