lk_oop-c_5-11.ppt
- Количество слайдов: 17
Лекция № 5 по дисциплине «Объектно-ориентированное программирование» на тему: Наследование
Понятие наследования Наследование позволяет определить общий класс, а затем определять другие классы путем добавления новых деталей в уже созданное общее определение класса. Общий класс называется базовым классом, или супер-классом, или родительским классом. Полученный на его основе класс называется производным, или наследуемым, или подклассом, или классом-наследником.
Связь базового класса и наследуемого ü Наследуемый класс того же типа, что и базовый класс ü Чем новый класс будет отличаться от базового класса? 1. Мы добавляем несколько новых функций к наследуемому классу. 2. Мы меняем поведение существующей функции базового класса. Это называется переопределением. Для переопределения функции создается новое определение для функции в наследуемом классе
Синтаксис записи производного класса class <наследник> : <режим доступа> <базовый класс> {<…>} Пример. class B : public A // класс B является наследником класса A { // реализация B, расширяющая возможности А }
Режимы доступа к производному классу Режимы доступа: внешнее, защищенное и внутреннее наследование. сlass имеет разделы с различным режимом доступа: public private protected – защищеный раздел класса, недоступный снаружи, доступен только в производном классе при наследованиии
Разновидности наследования class <наследник>: {public | private | protected} <предок>{ }; Режим доступа public – внешнее наследование интерфейс базового класса (раздел public) становится внешним интерфейсом производного класса. Режим доступа protected – защищенное наследование - внешний и защищенный разделы базового класса становится защищенными разделами производного класса. Режим доступа private – внутреннее наследование внешний и защищенный разделы базового класса становятся внутренними разделами производного класса, недоступны снаружи.
Пример с наследованием class Coord{ // базовый класс, описание двумерных координат protected: int x, y; public: Coord(); void Set. Coord(int x, int y); void Draw(); } // Через наследование создадим класс для описания трехмерных координат class Coord 3 D : public Coord{ // внешнее наследование protected: int z; // Добавим новую переменную – еще одну координату public: Coord 3 D(); void Set. Coord(int x, int y, int z); // переопределение метода void Draw(); };
Продолжение примера void Coord 3 D: : Set. Coord(int X, int Y, int Z) { // реализация метода z=Z; // Задать координаты x и y можно через метод базового класса: Coord: : Set. Coord(X, Y); //. . . или прямым присваиванием: x=X; y=Y; } // Еще один порожденный класс: class Color. Point 3 D : protected Coord 3 D{ // защищенное наследование private: int Color; int Radius; public: Draw(); };
Конструкторы в производных классах ü Конструктор производного класса может вызывать конструктор базового класса либо неявно, либо явно ü Конструкторы базового класса и операции присваивания базового класса не наследуются производными классами ü Если конструктор производного класса опущен, то конструктор по умолчанию производного класса вызывает конструктор по умолчанию базового класса.
Пример с конструкторами class Point { public: Point(int=0, int=0); //конструктор с полями по //умолчанию protected: int x, y; }; Point: : Point(int a, int b) { x=a; y=b; }
Продолжение примера 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; }
Преобразование объектов производного класса к базовому Ø При наследовании типа public объекты производного класса можно обрабатывать как объекты базового класса. Ø Ссылка на объект производного класса через указатель базового класса допускается. Можно обращаться только к элементам базового класса. Ø Ссылка на объект базового класса через указатель производного класса является синтаксической ошибкой.
Множественное наследование class Brush { // кисть для рисования, "пятно" protected: int Color; int Radius; … }; // Новый класс является наследником сразу двух //базовых классов: class Color. Point : protected Coord, private Brush { public: Draw(); // функция Draw использует свойства и //функции двух классов };
Виртуальные функции – это функции, прототипы которых объявлены в базовом классе с использованием ключевого слова virtual. Виртуальные функции позволяют в базовом классе задать действия, общие для всех производных классов. Базовый класс задает основной интерфейс, который будут иметь производные классы. Реализуется принцип "Один интерфейс, много функций"
Пример с виртуальными функциями class Shape : public Coord { // форма, фигура public: // виртуальная функция, реализация фиктивна virtual void Draw() {cout<<"This is Shape"; } // или //virtual void Draw()=0; чистая виртуальная //функция // реализация отсутствует, требуется // переопределение в производном классе. };
Продолжение примера // Через наследование создаем новый класс class Circle : public Shape { // окружность protected: int Radius; public: . . . void Draw(); // переопределение //виртуальной функции для Circle };
Окончание примера void main() { Circle C 1; // Объект типа Circle C 1. Draw(); C 1. Shape: : Draw(); Shape* p. Sh; // Указатель на базовый класс p. Sh=&C 1; // Указатель на базовый класс //используется для объекта порожденного класса p. Sh->Draw(); // Вызов функции Draw() для объекта Shape ((Circle*)p. Sh)->Draw(); // Преобразование указателя на базовый класс в указатель на производный и вызов функции Draw() для объекта Circle }
lk_oop-c_5-11.ppt