Слайд 1Лекция № 5 по дисциплине
«Объектно-ориентированное
программирование» на тему:
Наследование
Слайд 2Понятие наследования
Наследование позволяет определить общий класс, а затем определять
другие классы путем добавления новых деталей в уже созданное общее
определение класса.
Общий класс называется базовым классом, или супер-классом, или родительским классом. Полученный на его основе класс называется производным, или наследуемым, или подклассом, или классом-наследником.
Слайд 3Связь базового класса и наследуемого
Наследуемый класс того же типа,
что и базовый класс
Чем новый класс будет отличаться от
базового класса?
1. Мы добавляем несколько новых функций к наследуемому классу.
2. Мы меняем поведение существующей функции базового класса. Это называется переопределением.
Для переопределения функции создается новое определение для функции в наследуемом классе
Слайд 4Синтаксис записи производного класса
class :
класс> {}
Пример.
class B : public A // класс B является
наследником класса A
{
// реализация B, расширяющая возможности А
}
Слайд 5Режимы доступа к производному классу
Режимы доступа: внешнее, защищенное и
внутреннее наследование.
сlass имеет разделы с различным режимом доступа:
public
private
protected –
защищеный раздел класса, недоступный снаружи, доступен только в производном классе при наследованиии
Слайд 6Разновидности наследования
class : {public | private | protected} {
};
Режим
доступа public – внешнее наследование - интерфейс базового класса (раздел
public) становится внешним интерфейсом производного класса.
Режим доступа protected – защищенное наследование - внешний и защищенный разделы базового класса становится защищенными разделами производного класса.
Режим доступа private – внутреннее наследование - внешний и защищенный разделы базового класса становятся внутренними разделами производного класса, недоступны снаружи.
Слайд 7Пример с наследованием
class Coord{ // базовый класс, описание двумерных
координат
protected:
int x,y;
public:
Coord();
void SetCoord(int x,int y);
void Draw();
}
// Через наследование создадим класс для описания трехмерных координат
class Coord3D : public Coord{ // внешнее наследование
protected:
int z; // Добавим новую переменную – еще одну координату
public:
Coord3D();
void SetCoord(int x,int y, int z); // переопределение метода
void Draw();
};
Слайд 8Продолжение примера
void Coord3D::SetCoord(int X, int Y, int Z) { //
реализация метода
z=Z;
// Задать координаты x и y можно
через метод базового класса:
Coord::SetCoord(X,Y);
// ... или прямым присваиванием:
x=X;
y=Y;
}
// Еще один порожденный класс:
class ColorPoint3D : protected Coord3D{ // защищенное наследование
private:
int Color;
int Radius;
public:
Draw(); };
Слайд 9Конструкторы в производных классах
Конструктор производного класса может вызывать конструктор базового
класса либо неявно, либо явно
Конструкторы базового класса и операции присваивания
базового класса не наследуются производными классами
Если конструктор производного класса опущен, то конструктор по умолчанию производного класса вызывает конструктор по умолчанию базового класса.
Слайд 10Пример с конструкторами
class Point {
public:
Point(int=0, int=0); //конструктор с полями по //умолчанию
protected:
int x,y;
};
Point::Point(int a, int b) {
x=a;
y=b;
}
Слайд 11Продолжение примера
class Circle : public Point {
public:
Circle(double r=0.0, int x=0, int y=0); //конструктор с полями
//по умолчанию
private:
double radius;
};
Circle::Circle(double r, int a, int b) : Point (a,b) {
radius=r;
}
int main() {
Point p(5,7);
Circle c(4.5, 7,9);
return 0; }
Слайд 12Преобразование объектов производного класса к базовому
При наследовании типа
public объекты производного класса можно обрабатывать как объекты базового класса.
Ссылка на объект производного класса через указатель базового класса допускается. Можно обращаться только к элементам базового класса.
Ссылка на объект базового класса через указатель производного класса является синтаксической ошибкой.
Слайд 13Множественное наследование
class Brush { // кисть для рисования, "пятно"
protected:
int
Color;
int Radius;
… };
// Новый класс является наследником сразу двух
//базовых классов:
class ColorPoint : protected Coord, private Brush {
public:
Draw(); // функция Draw использует свойства и //функции двух классов
};
Слайд 14Виртуальные функции
Виртуальные функции – это функции, прототипы которых объявлены в
базовом классе с использованием ключевого слова virtual.
Виртуальные функции позволяют
в базовом классе задать действия, общие для всех производных классов.
Базовый класс задает основной интерфейс, который будут иметь производные классы.
Реализуется принцип "Один интерфейс, много функций"
Слайд 15Пример с виртуальными функциями
class Shape : public Coord
{ // форма, фигура
public:
// виртуальная функция, реализация фиктивна
virtual void
Draw() {cout<<"This is Shape";}
// или
//virtual void Draw()=0; чистая виртуальная //функция
// реализация отсутствует, требуется
// переопределение в производном классе.
};
Слайд 16Продолжение примера
// Через наследование создаем новый класс
class Circle :
public Shape { // окружность
protected:
int Radius;
public:
...
void Draw(); // переопределение //виртуальной функции для Circle
};
Слайд 17Окончание примера
void main() {
Circle C1; // Объект
типа Circle
C1.Draw();
C1.Shape::Draw();
Shape* pSh; // Указатель на
базовый класс
pSh=&C1; // Указатель на базовый класс //используется для объекта порожденного класса
pSh->Draw(); // Вызов функции Draw() для объекта Shape
((Circle*)pSh)->Draw(); // Преобразование указателя на базовый класс в указатель на производный и вызов функции Draw() для объекта Circle
}