c++ Базовый. Занятие 10

14
Модуль 3 : Основные понятия объектно-ориентированного программирования. Темы лекции : Композиция и наследование. Практическое задание : Наследование классов. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 10

Upload: igor-shkulipa

Post on 06-Apr-2017

55 views

Category:

Education


0 download

TRANSCRIPT

Модуль 3: Основные понятия объектно-ориентированного программирования.

Темы лекции: Композиция и наследование.

Практическое задание: Наследование классов.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 10

http://www.slideshare.net/IgorShkulipa 2

Композиция классов

Композиция – механизм для создания нового класса путемобъединения нескольких объектов существующих классов вединое целое.

При агрегировании между классами действует «отношениепринадлежности»

⚫ У машины есть кузов, колеса и двигатель

⚫ У человека есть голова, руки, ноги и тело

⚫ У треугольника есть вершины

Вложенные объекты обычно объявляются закрытыми (private)внутри класса-агрегата

http://www.slideshare.net/IgorShkulipa 3

Пример. Треугольник

class Point

{

public:

Point(double x, double y);

double GetX();

double GetY();

private:

double _x, _y;

};

class Triangle

{

public:

Triangle(Point p1, Point p2, Point p3);

Point GetPoint(int index);

double GetArea();

private:

Point _p1, _p2, _p3;

};

http://www.slideshare.net/IgorShkulipa 4

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

Наследование – это механизм ООП, позволяющий описать новыйкласс на основе уже существующего.

При наследовании свойства и функциональность родительскогокласса наследуются новым классом.

Класс-наследник имеет доступ к публичным (public) изащищенным (protected) методам и полям классародительского класса.

Класс-наследник может добавлять свои данные и методы, атакже переопределять методы базового класса

http://www.slideshare.net/IgorShkulipa 5

Основные термины

Родительский или базовый класс (класс-родитель) – класс,выступающий в качестве основы при наследовании.

Класс-потомок (дочерний класс, класс-наследник) – класс,образованный в результате наследования от родительскогокласса.

Иерархия наследования – отношения между родительскимклассом и его потомками.

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

Реализация класса – совокупность приватных методов иданных класса

http://www.slideshare.net/IgorShkulipa 6

Виды наследования

По типу наследования:

◦ Открытое (public) наследование

◦ Закрытое (private) наследование

◦ Защищенное (protected) наследование

По количеству базовых классов:

◦ Одиночное наследование (один базовый класс)

◦ Множественное наследование (два и более базовых классов)

http://www.slideshare.net/IgorShkulipa 7

Открытое наследование

class Point

{

private: double _x, _y;

...

}

class Figure

{

protected: Point _center;

public: Point GetCenter();

}

class Circle: public Figure

{

private: double _radius;

public: double GetArea();

}

class Triangle: public Figure

{

private: Point _a, _b, _c;

public: double GetArea();

}

Figure

Circle Triangle

http://www.slideshare.net/IgorShkulipa 8

Закрытое наследование

При закрытом наследовании открытые и защищенные поля иметоды родительского класса становятся закрытыми полями иметодами производного.

class List

{

public:

void AddElement(double value);

void RemoveElement(double value);

protected:

ListNode* _list;

};

class Stack: private List

{

public:

void Push(double value);

double Pop();

};

http://www.slideshare.net/IgorShkulipa 9

Защищенное наследование

При закрытом наследовании открытые и защищенные поля иметоды родительского класса становятся защищеннымиполями и методами производного. То есть эти поля доступныдля дальнейшего наследования

class List

{

public:

void AddElement(double value);

void RemoveElement(double value);

protected:

ListNode* _list;

};

class Stack: protected List

{

public:

void Push(double value);

double Pop();

};

http://www.slideshare.net/IgorShkulipa 10

Множественное наследование

Язык C++ допускает наследование класса от более, чем одногобазового класса.

Такое наследование называют множественным.

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

Например, класс может реализовывать сразу несколькоинтерфейсов или использовать несколько реализаций.

(!) На практике множественное наследование лучше неиспользовать.

http://www.slideshare.net/IgorShkulipa 11

Вызов конструкторов при наследовании

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

В C++ вызов конструктора базового класса происходит доинициализации полей класса наследника.

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

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

http://www.slideshare.net/IgorShkulipa 12

Вызов деструкторов при наследовании

В C++ деструкторы вызываются обратно порядку вызоваконструкторов.

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

http://www.slideshare.net/IgorShkulipa 13

Перегрузка методов

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

Количество и типы аргументов значения не имеют.

Для вызова метода родительского класса из метода класса наследникаиспользуется обращение к методу базового класса с помощью операции «::»

class Base{

public:

void Print()

{ cout << "Base::Print\n“; }

void Print(int param)

{ cout << "Base::Print " <<

param << "\n“; }

};

class Derived : public Base {

public:

void Print(int param)

{

Base::Print(param);

cout << "Derived::Print " <<

param << "\n";

}

};

http://www.slideshare.net/IgorShkulipa 14

Лабораторная работа №10. Наследование

Создать класс «Список». На основе этого класса создать классы-наследники - «Стек» и «Очередь».

Создать приложение для демонстрации работы классов.