Что называется наследованием с
Наследование (программирование)
Насле́дование — механизм объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Содержание
Типы наследования
Простое наследование
Класс, от которого произошло наследование, называется базовым или родительским (англ. base class ). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class ).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.
Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.
Наследование в C++: beginner, intermediate, advanced
В этой статье наследование описано на трех уровнях: beginner, intermediate и advanced. Expert нет. И ни слова про SOLID. Честно.
Beginner
Что такое наследование?
Наследование является одним из основополагающих принципов ООП. В соответствии с ним, класс может использовать переменные и методы другого класса как свои собственные.
Класс, который наследует данные, называется подклассом (subclass), производным классом (derived class) или дочерним классом (child). Класс, от которого наследуются данные или методы, называется суперклассом (super class), базовым классом (base class) или родительским классом (parent). Термины “родительский” и “дочерний” чрезвычайно полезны для понимания наследования. Как ребенок получает характеристики своих родителей, производный класс получает методы и переменные базового класса.
Наследование полезно, поскольку оно позволяет структурировать и повторно использовать код, что, в свою очередь, может значительно ускорить процесс разработки. Несмотря на это, наследование следует использовать с осторожностью, поскольку большинство изменений в суперклассе затронут все подклассы, что может привести к непредвиденным последствиям.
Важное примечание: приватные переменные и методы не могут быть унаследованы.
Типы наследования
В C ++ есть несколько типов наследования:
Конструкторы и деструкторы
В C ++ конструкторы и деструкторы не наследуются. Однако они вызываются, когда дочерний класс инициализирует свой объект. Конструкторы вызываются один за другим иерархически, начиная с базового класса и заканчивая последним производным классом. Деструкторы вызываются в обратном порядке.
Важное примечание: в этой статье не освещены виртуальные десктрукторы. Дополнительный материал на эту тему можно найти к примеру в этой статье на хабре.
Множественное наследование
Множественное наследование происходит, когда подкласс имеет два или более суперкласса. В этом примере, класс Laptop наследует и Monitor и Computer одновременно.
Проблематика множественного наследования
Множественное наследование требует тщательного проектирования, так как может привести к непредвиденным последствиям. Большинство таких последствий вызваны неоднозначностью в наследовании. В данном примере Laptop наследует метод turn_on() от обоих родителей и неясно какой метод должен быть вызван.
Несмотря на то, что приватные данные не наследуются, разрешить неоднозначное наследование изменением уровня доступа к данным на приватный невозможно. При компиляции, сначала происходит поиск метода или переменной, а уже после — проверка уровня доступа к ним.
Intermediate
Проблема ромба
Ромбовидная проблема — прежде всего проблема дизайна, и она должна быть предусмотрена на этапе проектирования. На этапе разработки ее можно разрешить следующим образом:
Проблема ромба: Конструкторы и деструкторы
Поскольку в С++ при инициализации объекта дочернего класса вызываются конструкторы всех родительских классов, возникает и другая проблема: конструктор базового класса Device будет вызван дважды.
Виртуальное наследование
Виртуальное наследование (virtual inheritance) предотвращает появление множественных объектов базового класса в иерархии наследования. Таким образом, конструктор базового класса Device будет вызван только единожды, а обращение к методу turn_on() без его переопределения в дочернем классе не будет вызывать ошибку при компиляции.
Примечание: виртуальное наследование в классах Computer и Monitor не разрешит ромбовидное наследование если дочерний класс Laptop будет наследовать класс Device не виртуально ( class Laptop: public Computer, public Monitor, public Device <>; ).
Абстрактный класс
В С++, класс в котором существует хотя бы один чистый виртуальный метод (pure virtual) принято считать абстрактным. Если виртуальный метод не переопределен в дочернем классе, код не скомпилируется. Также, в С++ создать объект абстрактного класса невозможно — попытка тоже вызовет ошибку при компиляции.
Интерфейс
С++, в отличии от некоторых ООП языков, не предоставляет отдельного ключевого слова для обозначения интерфейса (interface). Тем не менее, реализация интерфейса возможна путем создания чистого абстрактного класса (pure abstract class) — класса в котором присутствуют только декларации методов. Такие классы также часто называют абстрактными базовыми классами (Abstract Base Class — ABC).
Advanced
Несмотря на то, что наследование — фундаментальный принцип ООП, его стоит использовать с осторожностью. Важно думать о том, что любой код который будет использоваться скорее всего будет изменен и может быть использован неочевидным для разработчика путем.
Наследование от реализованного или частично реализованного класса
Если наследование происходит не от интерфейса (чистого абстрактного класса в контексте С++), а от класса в котором присутствуют какие-либо реализации, стоит учитывать то, что класс наследник связан с родительским классом наиболее тесной из возможных связью. Большинство изменений в классе родителя могут затронуть наследника что может привести к непредвиденному поведению. Такие изменения в поведении наследника не всегда очевидны — ошибка может возникнуть в уже оттестированом и рабочем коде. Данная ситуация усугубляется наличием сложной иерархии классов. Всегда стоит помнить о том, что код может изменяться не только человеком который его написал, и пути наследования очевидные для автора могут быть не учтены его коллегами.
В противовес этому стоит заметить что наследование от частично реализованных классов имеет неоспоримое преимущество. Библиотеки и фреймворки зачастую работают следующим образом: они предоставляют пользователю абстрактный класс с несколькими виртуальными и множеством реализованных методов. Таким образом, наибольшее количество работы уже проделано — сложная логика уже написана, а пользователю остается только кастомизировать готовое решение под свои нужды.
Интерфейс
Наследование от интерфейса (чистого абстрактного класса) преподносит наследование как возможность структурирования кода и защиту пользователя. Так как интерфейс описывает какую работу будет выполнять класс-реализация, но не описывает как именно, любой пользователь интерфейса огражден от изменений в классе который реализует этот интерфейс.
Интерфейс: Пример использования
Прежде всего стоит заметить, что пример тесно связан с понятием полиморфизма, но будет рассмотрен в контексте наследования от чистого абстрактного класса.
Приложение выполняющее абстрактную бизнес логику должно настраиваться из отдельного конфигурационного файла. На раннем этапе разработки, форматирование данного конфигурационного файла до конца сформировано не было. Вынесение парсинга файла за интерфейс предоставляет несколько преимуществ.
Отсутствие однозначности касательно форматирования конфигурационного файла не тормозит процесс разработки основной программы. Два разработчика могут работать параллельно — один над бизнес логикой, а другой над парсером. Поскольку они взаимодействуют через этот интерфейс, каждый из них может работать независимо. Данный подход облегчает покрытие кода юнит тестами, так как необходимые тесты могут быть написаны с использованием мока (mock) для этого интерфейса.
Также, при изменении формата конфигурационного файла, бизнес логика приложения не затрагивается. Единственное чего требует полный переход от одного форматирования к другому — написания новой реализации уже существующего абстрактного класса (класса-парсера). В дальнейшем, возврат к изначальному формату файла требует минимальной работы — подмены одного уже существующего парсера другим.
Заключение
Наследование предоставляет множество преимуществ, но должно быть тщательно спроектировано во избежание проблем, возможность для которых оно открывает. В контексте наследования, С++ предоставляет широкий спектр инструментов который открывает массу возможностей для программиста.
Простое наследование
Насле́дование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Содержание
Типы наследования
Простое наследование
Класс, от которого произошло наследование, называется базовым или родительским (англ. base class ). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class ).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник ВУЗа», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Эйфель. Множественное наследование поддерживается в языке Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных объектно-ориентированных языков программирования (C#, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.
Наследование в языке C++
В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:
Одним из основных преимуществ public-наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать:
Эта интересная особенность открывает возможность динамической идентификации типа (RTTI).
Наследование в языке Delphi
Для использования механизма наследования в class указать класс предок:
Наследование (право)
Наследование — приобретение имущества, оставшегося после смерти иного лица (наследодателя). Имущество, получаемое при наследовании, называют наследственным имуществом, наследственной массой, наследством. Наследство умершего переходит к наследникам в порядке универсального правопреемства, то есть в неизменном виде как единое целое и в один и тот же момент.
Унаследовать можно и (дворянские) титулы и престол (Престолонаследие). Иногда иронически говорят о «наследстве» отдельных распавшихся государств, особенно крупных империй. Популярны термины «Война за испанское наследство», «Война за австрийское наследство», «Война за баварское наследство».
Содержание
История
Наследование и наследство испокон веков играли большую роль в культурах различных стран и народов. Концепция наследования как некоего универсального посмертного преемства на все имущество умершего возникла в истории человеческого общества далеко не сразу.
В примитивных обществах принадлежавшее покойному движимое имущество часто рассматривалось как бесхозяйное, ничье, подлежащее свободному завладению любым. Пережиток этого сохранился в римском праве, которое провозглашало, что понятие воровства неприменимо к захвату наследственного имущества (rei hereditariae furtum non fit): пока оно не принято наследником, оно ещё ничье, и потому завладение им не есть кража. Но уже в древности возникла идея, что родственники умершего должны иметь преимущественное право на оставшееся после него имущество.
Наследование изначально возникло только как наследование по закону. Предопределенный семейным строем порядок наследования не должен был изменяться. Идея прижизненного волеизъявления собственника о порядке наследования его имущества возникала постепенно. Одним из древнейших видов посмертных распоряжений было распоряжение отца о разделе семейного имущества между детьми — законными наследниками. Другим способом такого распоряжения было усыновление будущего наследника.
Дальнейшим этапом стало назначение из имущества, переходящего к законным наследникам, отдельных частичных выдач (отказов, или легатов) в пользу церкви. У некоторых народов, отступление от обычных норм законного наследования и назначение наследника начинает допускаться с согласия всей общины, народного собрания (древнеримское testamentum comitiis calatis).
При этом свобода завещательных распоряжений допускалась легче по отношению к движимости и труднее по отношению к недвижимости. Так например, в германском обычном праве завещание могло касаться только движимого имущества, а недвижимость должна была переходить непременно к законным наследникам и даже не подлежала ответственности за долги (см. Фидеикомисс). Свобода завещания долго не допускалась по отношению к родовому, унаследованному имуществу. [1]
Поскольку наследование ставит одних людей с самого начала в более привилегированное положение, чем других, то само право наследования неоднократно подвергалось критике.
Одним из первых декретов Советской власти, принятым в апреле 1918 года, наследование было отменено. Имущество, оставшееся после смерти владельца, объявлялось достоянием РСФСР. Лишь нетрудоспособные родственники умершего могли получить содержание из него. Институт наследования был вновь введен в России в 1922 году, но общая сумма наследства не могла превышать 10 000 золотых рублей. Затем это ограничение было отменено. [2]
С 1.03.2002 г. вступила в силу 3-я часть ГК РФ, посвящённая наследственному праву, согласно которой число очередей наследников по закону доведено до восьми.
Состав наследства
В состав наследства входят принадлежавшие наследодателю на день открытия наследства вещи, иное имущество, в том числе имущественные права и обязанности;
Не входят в состав наследства права и обязанности, неразрывно связанные с личностью наследодателя, в частности право на алименты, право на возмещение вреда, причинённого жизни или здоровью гражданина, а также права и обязанности, переход которых в порядке наследования не допускается. Также в состав наследства не входят личные неимущественные права и другие нематериальные блага.
Открытие наследства
Время открытия наследства
Днём открытия наследства является день смерти гражданина. При объявлении наследодателя умершим днём открытия наследства является день вступления в законную силу решения суда об объявлении его умершим. А в случае, когда днём смерти признан день его предполагаемой гибели — день смерти, указанный в решении суда.
Лица, умершие в один и тот же день, считаются в целях наследственного правопреемства умершими одновременно и не наследуют друг после друга. При этом к наследованию призываются наследники каждого из них.
Место открытия наследства
Местом открытия наследства является последнее место жительства наследодателя. Если последнее место жительства наследодателя, обладавшего имуществом на территории России, неизвестно или находится за её пределами, местом открытия наследства в России признаётся место нахождения такого наследственного имущества. Если такое наследственное имущество находится в разных местах, местом открытия наследства является место нахождения входящих в его состав недвижимого имущества или наиболее ценной части недвижимого имущества, а при отсутствии недвижимого имущества — место нахождения движимого имущества или наиболее ценной части. Ценность имущества определяется исходя из его рыночной стоимости.
Лица, которые могут призываться к наследованию
К наследованию могут призываться физ.лица, находящиеся в живых в день открытия наследства, а также зачатые при жизни наследодателя и родившиеся живыми после открытия наследства (насцитурусы).
К наследованию по завещанию могут призываться также указанные в нём юридические лица, существующие на день открытия наследства, Российская Федерация, муниципальные образования, иностранные государства и международные организации. К наследованию по закону призывается также Российская Федерация в порядке наследования выморочного имущества.
Если призванный наследник умирает до принятия наследства, то в соответствии с наследственной трансмиссией к наследованию призываются его наследники.
Недостойные наследники
Не наследуют ни по закону, ни по завещанию лица, которые своими умышленными противоправными действиями, направленными против наследодателя, его наследников или против осуществления последней воли наследодателя, выраженной в завещании, способствовали (либо пытались способствовать) призванию их самих или других лиц к наследованию либо увеличению причитающейся им (другим лицам) доли наследства, если эти обстоятельства подтверждены в судебном порядке. Однако лица, которым наследодатель уже после утраты ими права наследования завещал имущество, вправе наследовать это имущество.
Не наследуют по закону родители после детей, в отношении которых родители были в судебном порядке лишены родительских прав и не восстановлены в этих правах ко дню открытия наследства.
По требованию заинтересованного лица суд отстраняет от наследования по закону лиц, злостно уклонявшихся от выполнения лежавших на них в силу закона обязанностей по содержанию наследодателя.
Виды наследования
Существуют 2 вида наследования: по завещанию и по закону. По закону наследуют ближайшие родственники умершего, обычно в том случае, если он не оставил завещание; по завещанию имущество может получить кто угодно — не только физические лица, но также частные организации и само государство.
Наследование по закону
По закону наследуется имущество наследодателя, которое не было им завещано. Все возможные наследники по закону делятся на несколько очередей. Наследники каждой очереди могут наследовать имущество, если наследники всех предшествующих очередей отсутствуют, не приняли наследство, отказались от него, либо утратили на него право (согласно завещанию или в результате своих противоправных действий). Имущество, наследуемое по закону, делится поровну между наследниками соответствующей очереди.
В настоящее время в России установлены восемь очередей наследников по закону:
Если наследник по закону умирает раньше наследодателя или одновременно с ним, то в некоторых случаях потомки этого наследника получают возможность наследовать вместо него по праву представления: в этом случае доля, которая причиталась бы этому умершему наследнику, делится между его потомками. В настоящее время в России наследуют по праву представления:
Во втором и третьем случае право представления ограничено только детьми умерших наследников; более дальние потомки относятся к 5 и 6 очередям или не наследуют по закону вообще.
Наследование по завещанию
Завещание — односторонняя сделка, распоряжение своим имуществом на случай смерти. Оно вступает в действие с момента открытия наследства, когда уже нет в живых наследодателя. Оно представляет собой выражение воли завещателя, которая непосредственно связана с его личностью. Право завещать имущество является элементом правоспособности. Завещатель вправе распорядиться любым своим имуществом, в том числе и тем, которое он приобретёт в будущем. Кроме того, завещатель вправе лишить наследства одного или нескольких наследников по закону.
Завещание должно быть составлено в письменной форме и заверено нотариусом или иным должностным лицом прямо указанным в законе. Не соблюдение требования об удостоверении завещания влечет его недействительность, однако в особых случаях (указанных ст.1129 Гражданского Кодекса) допускается составление завещания в простой письменной форме.
Завещатель по принципу свободы завещания вправе отменить или изменить (дополнить) составленное им завещание в любое время после его совершения и не обязан сообщать кому-либо об этом, а также указывать причины его отмены/изменения. При этом новое завещание, даже не содержащее явных указаний об отмене предыдущего, отменяет те его положения, которым оно противоречит.
Наследниками по завещанию могут быть физические и юридические лица, международные организации т. д.
Обязательная доля
Несовершеннолетние/нетрудоспособные дети наследодателя, его нетрудоспособные супруг и родители, а также нетрудоспособные иждивенцы (подлежащие призванию к наследованию см.выше), наследуют независимо от завещания не менее 1/2 доли, которая причиталась бы каждому из них при наследовании по закону (ст.1149 ГК РФ).
Процедура
Вступить в права наследования по законодательству России нужно в течение 6 месяцев после открытия наследства. Если же в течение шести месяцев наследник не заявил о своих правах по уважительной причине или если наследник не знал и не должен был знать об открытии наследства суд может восстановить срок наследования имущества. Также суд может восстановить срок наследования по причине болезни наследника или в связи с обстоятельствами, затрудняющими вступление в наследство [1].
Наследство может быть принято наследником по истечении срока принятия наследства без обращения в суд при условии согласия в письменной форме от всех наследников, принявших наследство. Если это согласие в письменной форме дается наследниками не в присутствии нотариуса, их подписи на документах о согласии должны быть засвидетельствованы (в порядке абзаца 2 пункта 1 ст.1153 ГК РФ). Согласие наследников является основанием аннулирования нотариусом ранее выданного свидетельства о праве на наследство и основанием выдачи нового свидетельства.
По искам наследников суд определяет доли всех наследников в наследственном имуществе оставшимся после умершего, также при необходимости определяет меры по защите интересов нового наследника на причитающуюся ему долю/доли в наследуемом имуществе после умершего. Ранее выданные свидетельства о праве на наследство признаются по решению суда недействительными.
При наследовании по закону, если наследственное имущество переходит к двум или нескольким наследникам, и при наследовании по завещанию, если оно завещано двум или нескольким наследникам без указания наследуемого каждым из них конкретного имущества, наследственное имущество поступает со дня открытия наследства в общую долевую собственность наследников, затем оно может быть разделено по соглашению между ними (ст.1164 и 1165 ГК РФ).
Ответственность наследников по долгам наследодателя
По действующему российскому праву каждый из наследников отвечает по долгам наследодателя в пределах стоимости перешедшего к нему наследственного имущества (ст.1175 ГК РФ).
Римское право предусматривало неограниченную ответственность принявших наследство наследников по долгам наследодателя. Такое же правило было установлено и законодательством Российской империи. [3]
Выморочное имущество
Если какое-либо имущество не может быть унаследовано ни по закону, ни по завещанию (наследники отсутствуют, не приняли наследство, утратили на него право), то это имущество называется выморочным и переходит в собственность Российской Федерации, а недвижимость — в собственность соответствующего муниципального образования или города федерального значения.