Пример наследования

Базовое наследование в С++

Пример наследования

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

Наследование в С++

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

В диаграмме, представленной выше, Фрукт является родительским классом, а Яблоко и Банан — дочерними классами.

В этой диаграмме Треугольник является дочерним классом (родитель — Фигура) и родительским (для Правильного треугольника) одновременно.

Дочерний класс наследует как поведение (методы), так и свойства (переменные-члены) от родителя (с учетом некоторых ограничений доступа, которые мы рассмотрим чуть позже). Эти методы и переменные становятся членами дочернего класса.

Поскольку дочерние классы являются полноценными классами, то они могут (конечно) иметь и свои собственные члены. Сейчас мы это всё рассмотрим детально.

Класс Human

Вот простой класс Human для представления Человека:

#include class Human { public: std::string m_name; int m_age; Human(std::string name = “”, int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } };

    Human(std::string name = “”, int age = 0)        : m_name(name), m_age(age)    std::string getName() const { return m_name; }    int getAge() const { return m_age; }

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

Обратите внимание, в примере, приведенном выше, мы сделали все переменные-члены и методы класса открытыми. Это сделано ради простоты примера. Обычно переменные-члены нужно делать private. О средствах контроля доступа и о том, как это работает в наследовании, мы поговорим на соответствующих уроках.

Класс BasketballPlayer

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

Вот наш незавершенный класс BasketballPlayer:

class BasketballPlayer { public: double m_gameAverage; int m_points; BasketballPlayer(double gameAverage = 0.0, int points = 0) : m_gameAverage(gameAverage), m_points(points) { } };

    BasketballPlayer(double gameAverage = 0.0, int points = 0)       : m_gameAverage(gameAverage), m_points(points)

Также нам нужно знать Имя и Возраст баскетболиста, а эта информация уже у нас есть: она хранится в классе Human.

У нас есть три варианта добавления Имени и Возраста в BasketballPlayer:

   Добавить Имя и Возраст в класс BasketballPlayer непосредственно в качестве членов. Это плохой вариант, так как произойдет дублирование кода, который уже существует в классе Human. Любые обновления в Human также должны быть продублированы и в BasketballPlayer.

   Добавить класс Human в качестве члена в класс BasketballPlayer, используя композицию. Но возникает вопрос: «Может ли BasketballPlayer иметь Human?». Нет, это некорректно.

   Сделать так, чтобы BasketballPlayer унаследовал необходимые атрибуты от Human. Помните, что тип отношений в наследовании — «является». Является ли BasketballPlayer Human-ом (т.е. Человеком)? Конечно! Поэтому наш выбор — наследование.

Делаем класс BasketballPlayer дочерним

Чтобы класс BasketballPlayer унаследовал информацию от класса Human, нам нужно после объявления BasketballPlayer (class BasketballPlayer) использовать двоеточие, ключевое слово public и имя класса, от которого мы хотим унаследовать. Это называется открытым наследованием:

// BasketballPlayer открыто наследует Human class BasketballPlayer : public Human { public: double m_gameAverage; int m_points; BasketballPlayer(double gameAverage = 0.0, int points = 0) : m_gameAverage(gameAverage), m_points(points) { } };

// BasketballPlayer открыто наследует Humanclass BasketballPlayer : public Human    BasketballPlayer(double gameAverage = 0.0, int points = 0)       : m_gameAverage(gameAverage), m_points(points)

Проиллюстрируем:

Когда BasketballPlayer наследует свойства класса Human, то BasketballPlayer приобретает методы и переменные-члены класса Human. Кроме того, BasketballPlayer имеет еще два своих собственных члена: m_gameAverage и m_points. Здесь есть смысл, так как эти свойства специфичны только для BasketballPlayer, а не для каждого Human-а.

Таким образом, объекты BasketballPlayer будут иметь 4 члена:

   m_gameAverage и m_points от BasketballPlayer;

   m_name и m_age от Human.

Полный код программы:

#include #include class Human { public: std::string m_name; int m_age; Human(std::string name = “”, int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } }; // BasketballPlayer открыто наследует Human class BasketballPlayer : public Human { public: double m_gameAverage; int m_points; BasketballPlayer(double gameAverage = 0.0, int points = 0) : m_gameAverage(gameAverage), m_points(points) { } }; int main() { // Создаем нового Баскетболиста BasketballPlayer anton; // Присваиваем ему имя (мы можем делать это напрямую, так как m_name является public) anton.m_name = “Anton”; // Выводим имя Баскетболиста std::cout

Источник: https://ravesli.com/urok-154-bazovoe-nasledovanie-v-c/

ООП. Часть 5. Наследование и ещё немного полиморфизма

Пример наследования

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

class Vehicle{ public string name; public int speed; public int x; public int y; public void Move(Direction d) { switch(d) { case Direction.Forward: y += speed; break; case Direction.Backward: y -= speed; break; case Direction.Left: x -= speed; break; case Direction.Right: x += speed; break; } }}

Этот класс (Vehicle) представляет собой транспортное средство, но пока у него есть только слишком общие свойства (название, координаты и скорость) и поведение (перемещение). Нам может понадобиться реализовать класс, который тоже относится к транспортным средствам, но более конкретным. Например, это будет автомобиль (Car).

Если мы хотим, чтобы класс Car наследовал поля и методы класса Vehicle, то при его объявлении после названия нужно поставить двоеточие и имя родительского класса:

class Car : Vehicle{ }

Теперь объекты класса Car обладают всеми полями и методами класса Vehicle:

Vehicle a = new Vehicle() { name = “Motorcycle”, speed = 2, x = 5, y = 10}; Car b = new Car() { name = “Car”, speed = 3, x = 15, y = 40}; a.Move(Direction.Forward);b.Move(Direction.Left); a = b;

Внимание! Наследовать можно только от одного класса.

Чтобы добавить в дочерний класс новое поле или метод, нужно просто объявить их:

class Car : Vehicle{ public int horsePower = 1000; public void Beep() { Console.WriteLine(“Beep!”); }}

Теперь объекты этого класса могут использовать как метод Move (), так и метод Beep (). То же самое касается и полей.

Допустим, у родительского класса есть конструктор, который принимает один аргумент:

public Vehicle(string name){ this.name = name;}

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

public Car(string name, int horsePower) :base(name){ this.horsePower = horsePower;}

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

Если вы не хотите ничего вызывать, то просто создайте в наследуемом классе пустой конструктор.

Часто бывает нужно, чтобы какой-то метод в дочернем классе работал немного иначе, чем в родительском. Например, в методе Move () для класса Car можно прописать условие, которое будет проверять, не кончилось ли топливо. Точно так же может появиться необходимость переопределить свойство.

Методы и свойства, которые можно переопределить, называются виртуальными. В родительском классе для них указывается модификатор virtual:

public virtual void GetInfo(){ Console.WriteLine($”Name: {name}Speed: {speed}”);}

А в дочернем для переопределения используется модификатор override:

public override void GetInfo(){ Console.WriteLine($”Name: {name}Speed: {speed} Horse power: {horsePower}”);}

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

Несмотря на то что наследовать можно только от одного класса, существует также и класс Object, который является родительским для всех остальных. У него есть четыре метода:
  1. Equals () — проверяет, равен ли текущий объект тому, что был передан в аргументе.
  2. ToString ()— преобразует объект в строку.
  3. GetHashCode () — получает числовой хеш объекта. Этот метод редко используется, потому что может возвращать одинаковый хеш для разных объектов.
  4. GetType ()— получает тип объекта.

Любой из них также может быть переопределён или перегружен. Например, метод Equals () можно использовать, чтобы он проверял, равны ли поля объектов:

public bool Equals(Car obj){ bool areEqual = false; if(obj.name == this.name && obj.horsePower == this.horsePower) { areEqual = true; } return areEqual;}

В данном случае это именно перегрузка, потому что ни один из вариантов метода Equals () не принимал объект класса Car. Отсюда следует, что переопределить можно только метод с такими же принимаемыми аргументами.

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

  1. Наследовать можно только от класса, уровень доступа которого выше дочернего или равен ему. То есть публичный класс не может наследоваться от приватного.
  2. Дочерний класс не может обращаться к приватным полям и методам родительского. Поэтому нужно либо определять логику приватных компонентов в базовом классе, либо создавать публичные свойства и методы, которые будут своего рода посредниками.
  3. У дочернего класса может быть только один родительский, но у родительского может быть несколько дочерних.
  4. Нельзя наследовать от класса с модификатором static.
  5. Можно наследовать от класса, который наследует от другого класса. Но с этим лучше не злоупотреблять, потому что можно быстро запутаться в их взаимосвязях.

Чтобы лучше это усвоить, стоит попробовать поработать с каждой особенностью на практике и немного поэкспериментировать.

Создайте несколько классов персонажей: например, воин, лучник и маг.

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

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

С помощью наследования можно создавать множество полезных классов с общим поведением и свойствами, при этом не дублируя код. Однако это ещё не всё, что можно использовать, — в следующей статье вы узнаете про интерфейсы и абстрактные классы.

А чтобы на практике узнать, как используется ООП со всеми его особенностями, записывайтесь на курс «C#-разработчик с 0 до PRO». Вы попробуете разрабатывать на C# сайты и десктопные приложения, выжимая максимум из объектно-ориентированного программирования.

130 часов — и вы научитесь писать программы на языке, созданном Microsoft. Вы создадите 5 проектов для портфолио, даже если до этого никогда не программировали. После обучения — гарантированное трудоустройство.

Источник: https://skillbox.ru/media/code/oop_chast_5_polimorfizm/

Наследники по закону

Пример наследования

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

Круг наследников по закону

Наследование без завещания идет по очередности, данной в главе 63 ГК РФ.  Выделяется семь очередей, участники каждой последующей включают в наследственный процесс когда:

Внимание. Если у вас возникнут вопросы, можете бесплатно проконсультироваться с юристом по телефонам: 8 800 350 83 46 по все России. Звонки принимаются круглосуточно.

  • нет лиц из предыдущей очереди;
  • граждане из нее лишены права стать получателями наследства;
  • от всех претендентов поступил отказ от наследственной массы.

Сбой в очередности возможен из-за права представления. Если наследник умирает до/одновременно с наследодателем, то положенная доля полагается его наследникам.

Рассмотрим, кто является наследниками:

  1. Наследники первой очереди по закону: наиболее близкая родня по прямой линии — дети, мать/отец, супруг.
  2. Наследники второй очереди по закону представляют лиц, отделенных от покойного одним коленом родства: брат/сестра (одинаковыми правами обладают сводные), бабушки/дедушки с обеих сторон рода.
  3. Наследниками по закону третьей очереди являются дяди/тети. Их потомки включаются в круг получателей по представительному праву.
  4. Четвертая очередь – прабабушки и прадедушки с обеих сторон.
  5. К пятой относятся двоюродные родственники: внуки, дедушки/бабушки.
  6. Категория шестой очереди представлена двоюродными правнуками, племянниками, дядями/тетями.
  7. К седьмой очереди приписаны падчерицы/пасынки, мачехи/отчимы.

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

Внимание. Если у вас возникнут вопросы, можете бесплатно проконсультироваться с юристом по телефонам: 8 800 350 83 46 по все России. Звонки принимаются круглосуточно.

Наследники по закону внутри очереди наследуют в одинаковых частях.

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

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

  • несовершеннолетние дети;
  • нетрудоспособные члены семьи, такие как родители или дети. Под нетрудоспособностью понимается наличие инвалидности, возраст (пенсионный, до 16 лет);
  • иждивенцы, которые ранее были на попечении умершего.

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

Наследование усыновленными

Законодательство придерживается следующих точек зрения:

  1. Усыновитель и усыновленный принимаются как родственники. Это касается их родни с обеих сторон. То есть при смерти одного из данных лиц второй вступает в очередь на равных правах с родными детьми умершего.
  2. Усыновленное лицо и его биологические родители, а также родственники с обеих сторон, не считаются наследниками.
  3. Из предыдущего пункта закон делает исключение. Оно заключается в случаях, когда усыновленный ребенок продолжает сохранять связь и общение со своими родственниками по происхождению. Сохранение общения регламентировано решением суда.

Порядок наследования иждивенцами

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

  • наличии инвалидности, которая не дает возможности вести трудовую деятельность и содержать себя;
  • пенсионный возраст;
  • несовершеннолетие.

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

Если у умершего нет наследников семи очередей, то иждивенцы составляют восьмую очередь.

Какие требования предъявляет Гражданский кодекс к иждивенцам для включения их в круг наследников:

  1. Гражданин содержался умершим от 1 года.
  2. Материальная помощь оказывалась до срока не меньше года до кончины.
  3. Факт совместного или раздельного проживания неважен.

Как лишить наследства наследника по закону?

Лишение права возможно:

  • в самом завещании согласно воле покойного;
  • через суд путем признания одного из наследников недостойным.

Что законодательство понимает под недостойностью:

  1. Лицо, совершившее по отношению к покойному или иным наследникам преступные деяния в попытке ускорить получение наследства и увеличить его массу.
  2. Попытки препятствования последней воле наследодателя, например порча или подделка завещания;
  3. Лишение родительских прав.
  4. Отсутствие от наследника помощи в адрес покойного, если он входил в круг лиц, обязанных содержать его или заключал соглашение на досмотр.

Статус «недостойный» присваивается в ходе судебного слушания, который инициируется заинтересованной стороной.

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

Пример наследования по закону

После смерти пенсионерки Антонины Васильевны, которая не оставила завещания, ее единственным наследником является 40-летний сын Александр. Ему по закону должна перейти трехкомнатная квартира и дачный участок женщины.

Младшая сестра умершей Елена обращается с иском в суд о признании Александра недостойным наследства. В качестве аргумента женщина выдвигает следующие моменты:

  • сын не общался с матерью последние 15 лет;
  • когда 6 лет назад женщина пыталась просить у него помощи для оплаты операции, он отказал. Свидетелями этого выступили соседи молодого человека, которые хорошо помнили, как он выгнал пожилую женщину из дома и опознали в ней по фотографии покойную;
  • материальную помощь женщине последние 10 лет оказывала семья младшей сестры. Они помогали женщине с продуктами, оплатой коммунальных услуг и сделали в двух комнатах ремонт. Последние два факта Елена подтвердила сохранившимися чеками, квитанциями и договором со строительной организацией.

Рассмотрев материалы дела, суд признает сына наследодателя недостойным наследником:

  1. Не оказывавшим нуждающейся матери-пенсионерки материальной помощи.
  2. Отказавшим в оплате лечения, что косвенно могло повлиять на ее смерть.

Очередь переходит к Елене как представителю следующей очереди.

Заключение

  1. Прямые наследники определяются по степени родства и составляют восемь очередей. Наследование последующей возможно при отсутствии лиц из предыдущей.
  2. Если есть завещание, то наследники по закону претендуют на часть, не упомянутую в последней воле умершего.

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

  5. Наследник исключается из круга получателей самим умершим в завещании или как недостойный по судебному решению.

Наиболее популярный вопрос и ответ на него по наследникам по закону

Вопрос: В апреле 2017 умерла тетя моей матери. Мамы не стало буквально спустя неделю. Нотариус пояснил мне, что я наследница тети, так как наследую вместо своей мамы.

У тети был единственный близкий родственник – брат, но его местонахождение давно неизвестно (около 20 лет как уехал на север и потерялся).

  Могу ли я наследовать имущество, зная о наличии брата, и что будет, когда он объявится?

Ответ: Если Вы имеете конкретные сведения о местоположении брата умершей или можете поспособствовать его поискам – то должны это сделать. Если в срок 6 месяцев он не объявится, то в наследство вступаете Вы как представитель следующей очереди.

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

Список законов

глава 63 ГК РФ

Внимание. Если у вас возникнут вопросы, можете бесплатно проконсультироваться с юристом по телефонам: 8 800 350 83 46 по все России. Звонки принимаются круглосуточно.

Источник: http://www.bequest-expert.ru/nasledstvo/nasledovanie-po-zakonu/nasledniki-po-zakonu/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.