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

Содержание

Слайд 2

Что такое наследование?

Наследование – отношение между двумя классами (предком и потомком),когда объект-потомок

Что такое наследование? Наследование – отношение между двумя классами (предком и потомком),когда
повторяет элементы структуры и поведения предка.
Наследование призвано отображать иерархичность реального мира:

Класс 1

Класс 5 (потомок классов 1 и 3)

Класс 4 (потомок классов 1 и 3)

Класс 3 (потомок класса 1)

Класс 2 (потомок класса 1)

Слайд 3

Пример иерархии понятий

Пример иерархии понятий

Слайд 4

Реализация наследования в ООП

В объектно-ориентированном программировании наследование реализуется с помощью возможности порождать

Реализация наследования в ООП В объектно-ориентированном программировании наследование реализуется с помощью возможности
один класс от другого, передавая порождаемому (производному) классу  от класса-предка (базового класса) все поля и методы и добавляя, при необходимости, новые поля и методы.
В языке C++ для класса может существовать несколько непосредственных предков (родителей)

Слайд 5

Возможности наследования

Добавлять в производном классе данные, которые представляет базовый класс
Дополнять в производном

Возможности наследования Добавлять в производном классе данные, которые представляет базовый класс Дополнять
классе функциональные возможности базового класса
Модифицировать в производном классе методы базового класса
НЕЛЬЗЯ:
Модифицировать в производном классе данные, представленные базовым классом (сохранив их идентификаторы)

Слайд 6

Пример передачи полей и методов при наследовании

Пример передачи полей и методов при наследовании

Слайд 7

Пример передачи полей и методов при наследовании

Пример передачи полей и методов при наследовании

Слайд 8

Спецификатор доступа protected

Для того, чтобы организовать эффективную работу для программистов – авторов

Спецификатор доступа protected Для того, чтобы организовать эффективную работу для программистов –
классов-потомков, введен специальный спецификатор доступа protected.
Полный список спецификаторов доступа:
private: - члены класса, доступные только разработчикам класса (т.е. только при реализации методов этого класса)
public: - члены класса, доступные как разработчикам, так и пользователям класса
protected: - члены класса, доступные разработчикам класса и разработчикам классов-потомков

Слайд 9

Реализация наследования

class имяклассанаследника :
private | public | protected // ключидоступа
базовыйкласс
{телокласса};

Реализация наследования class имяклассанаследника : private | public | protected // ключидоступа базовыйкласс {телокласса};

Слайд 10

Переопределение и перегрузка

Переопределение метода – ситуация, когда в классе-потомке определяется метод с

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

Слайд 11

Пример наследования: точка в трёхмерном пространстве

class Point3D: public Point2D{
private:
double z;
public:
Point3D(double=0,

Пример наследования: точка в трёхмерном пространстве class Point3D: public Point2D{ private: double
double=0, double=0);
double GetZ() const;
void SetZ(double az);
double Module() const;

};

Слайд 12

Реализация класса Point3D

Point3D::Point3D(double ax, double ay, double az):
Point2D(ax, ay), z(az){}
double Point3D::GetZ()

Реализация класса Point3D Point3D::Point3D(double ax, double ay, double az): Point2D(ax, ay), z(az){}
const { return z; }
void Point3D::SetZ(double az) {z = az;}
double Point3D:: Module() const
{ return sqrt(x*x + y*y + z*z); }
// не будет компилироваться из-за запрета
// на доступ к x и y, если эти поля не объявлены
// со спецификатором protected
// Правильный вариант:
double Point3D::Module() const {
double x = GetX(), y = GetY();
return sqrt(x*x + y*y + z*z);
)

Слайд 13

Доступ к методам предка

double Point3D::GetRo () const {
return Point2D::Module();
}

Для доступа к

Доступ к методам предка double Point3D::GetRo () const { return Point2D::Module(); }
методам предка, переопределённым в классе-потомке, используется операция ::
Пример: получить координату ρ для цилиндрической системы координат (ρ, φ, z)

Слайд 14

Особенности реализации наследования

Конструкторы не наследуются;
Деструктор не наследуется;
Переопределённая операция присваивания не наследуется;
Нет класса

Особенности реализации наследования Конструкторы не наследуются; Деструктор не наследуется; Переопределённая операция присваивания
– прародителя всех классов.

Слайд 15

Соответствие и преобразование типов при наследовании

В левой части операции присваивания может стоять

Соответствие и преобразование типов при наследовании В левой части операции присваивания может
предок, а в правой – потомок (но не наоборот!)
В левой части операции присваивания может стоять указатель на предка, а в правой – указатель на потомка (но не наоборот!)
С помощью операции new можно указателю на предка присвоить адрес памяти, выделенной потомку (но не наоборот);
Если формальный параметр функции – предок (указатель или ссылка), то фактическим параметром может быть потомок (указатель или ссылка).

Слайд 16

Соответствие и преобразование типов при наследовании (примеры)

Point2D p(3,7);
Point2D* cp;
Point3D q(2, 9, 4);
Point3D*

Соответствие и преобразование типов при наследовании (примеры) Point2D p(3,7); Point2D* cp; Point3D
cq;
p = q; // можно
q = p; // нельзя
сp = сq; // можно
сq = сp; // нельзя
сp = new Point3D(); // можно
сq = new Point2D(); // нельзя