SlideShare a Scribd company logo
1 of 14
Прикладное программирование
кафедра
прикладной и компьютерной оптики
Наследование
2
Наследование
Наследование – такое отношение между классами когда
один из них наследует (повторяет) структуру и поведение
другого
 cодержание (переменные-члены)
 поведение (функции-члены)
3
Пример наследования:
линза и зеркало
class Lens
{
Position m_p;
Media m_media;
double m_R1, m_R2;
double m_d, m_D;
};
class Mirror
{
Position m_p;
double m_R;
double m_D;
};
4
Пример наследования:
деталь
// базовый класс
class Detail
{
protected:
Position m_p;
double m_D;
};
// класс-наследник
class Lens : public
Detail
{
private:
Media m_media;
double m_R1, m_R2;
double m_d;
};
// класс-наследник
class Mirror : public Detail
{
private:
double m_R;
};
См. пример программы
5
Доступ к членам класса
public
(открытые)
protected
(защищенные)
private
(закрытые)
функции-члены и друзья
класса
+ + +
функции-члены и друзья
производных классов
+ + –
пользователи + – –
6
Типы наследования
class X : public Y;
 наследник является подтипом и выполняет все обязательства родителя
 допустимо преобразование X* в Y*
class X : private Y;
 наследник не будет подтипом родителя
 public и protected члены родителя станут private членами наследника
 преобразование X* в Y* допустимо для друзей и членов X
 последующее наследование не имеет смысла
class X : protected Y;
 наследник не будет подтипом родителя
 public и protected члены родителя станут protected членами наследника
 преобразование X* в Y* допустимо для членов и друзей и наследников X
7
Доступ к переменным-членам
базового класса
public
(открытые)
protected
(защищенные)
private
(закрытые)
public-наследование public protected недоступны
protected-наследование protected protected недоступны
private-наследование private private недоступны
См. пример программы
8
Последовательность вызовов
конструкторов и деструкторов
При создании экземпляра класса Lens
 сначала вызовется конструктор базового класса Detail()
 потом конструктор класса Lens()
При разрушении экземпляра класса Lens деструкторы
будут вызваны в обратном порядке:
 сначала деструктор наследника ~Lens()
 потом деструктор базового класса ~Detail()
В конструкторе наследника с параметрами следует
вызывать конструктор базового класса
 (по умолчанию будет вызван конструктор базового класса без параметров)
См. пример программы
9
Множественное наследование
class Child : public Base1, public Base2
{
public:
Child();
~Child();
};
 при создании экземпляра класса Child: Base1(), Base2(), Child()
 при разрушении экземпляра класса Child: ~Child(), ~Base2(), ~Base1()
class Base1
{
public:
Base1();
~Base1();
};
class Base2
{
public:
Base2();
~Base2();
};
10
Виртуальные функции
Виртуальные функции – функции базового класса,
которые можно заместить в каждом производном классе
 позволяют избавиться от переменных-членов, представляющих собой
флаг или тип отвечающий за внутреннее строение класса
 всегда будет вызываться функция наследника
11
Виртуальная функция
в базовом классе
class Detail
{
public:
virtual void print() const;
};
//////////////////////////////////////////////
void main ()
{
// виртуальные функции важны, когда создаются
указатели на класс
Detail *p=new Lens;
}
См. пример программы
12
Перегруженные функции в
классах-наследниках
Detail *l=new Lens;
Если должны вызываться "родные" функции-члены
классов, то используется обычная перегрузка
l.print(); // Detail::print
Если функция-член базового класса должна подменяться
функцией-членом класса-наследника, то при ее
объявлении используется модификатор virtual
l.print(); // Lens::print
Если должны вызываться последовательно обе функции,
то это необходимо сделать принудительно вызвав
функцию-член базового класса
Detail::print();
13
Виртуальные деструкторы
class Shape
{
public:
Shape() { };
virtual ~Shape() { };
};
//////////////////////////
void main()
{
Shape* s=new Polygon();
...
delete s;
}
class Polygon : public Shape
{
private:
Point* m_points;
public:
Polygon(int n)
{
m_points=new Point[n];
};
~Polygon()
{
delete [] m_points;
};
};
См. пример программы
14
Абстрактные классы
Абстрактный класс – класс, имеющий чисто виртуальные функции
 чисто виртуальная функция – функция не определена в базовом классе, и
обязательно должна быть перегружена в наследниках
 экземпляр абстрактного класса создать нельзя, но можно создать экземпляры его
наследников
// чисто виртуальный класс Деталь
class Detail
{
protected:
double m_z, m_D;
public:
// ...
// вычисление хода луча
virtual void RayTrace() = 0;
};
См. пример программы

More Related Content

Similar to Lecture 4

Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
metaform
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
Technopark
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
Technopark
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
Technopark
 

Similar to Lecture 4 (20)

Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
модуль 04
модуль 04модуль 04
модуль 04
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
Tdd php
Tdd phpTdd php
Tdd php
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
лек5 6
лек5 6лек5 6
лек5 6
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 

More from Anastasia Snegina

птп по ппп 2013 2014
птп по ппп 2013 2014 птп по ппп 2013 2014
птп по ппп 2013 2014
Anastasia Snegina
 
прикл.прогр птп 13 14
прикл.прогр птп 13 14прикл.прогр птп 13 14
прикл.прогр птп 13 14
Anastasia Snegina
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
Anastasia Snegina
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
Anastasia Snegina
 
рп по у пп практике в
рп по у пп практике врп по у пп практике в
рп по у пп практике в
Anastasia Snegina
 
рп по пр практике в
рп по пр практике врп по пр практике в
рп по пр практике в
Anastasia Snegina
 
рп по у сп практике в
рп по у сп практике врп по у сп практике в
рп по у сп практике в
Anastasia Snegina
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
Anastasia Snegina
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
Anastasia Snegina
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
Anastasia Snegina
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
Anastasia Snegina
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
Anastasia Snegina
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
Anastasia Snegina
 

More from Anastasia Snegina (20)

птп по ппп 2013 2014
птп по ппп 2013 2014 птп по ппп 2013 2014
птп по ппп 2013 2014
 
прикл.прогр птп 13 14
прикл.прогр птп 13 14прикл.прогр птп 13 14
прикл.прогр птп 13 14
 
я.прогр птп
я.прогр птпя.прогр птп
я.прогр птп
 
пп кос вт
пп кос втпп кос вт
пп кос вт
 
пп кос в
пп кос впп кос в
пп кос в
 
пп кос в
пп кос впп кос в
пп кос в
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
 
пп кос вт
пп кос втпп кос вт
пп кос вт
 
рп по у пп практике в
рп по у пп практике врп по у пп практике в
рп по у пп практике в
 
рп по пр практике в
рп по пр практике врп по пр практике в
рп по пр практике в
 
рп по у сп практике в
рп по у сп практике врп по у сп практике в
рп по у сп практике в
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
 
лр18
лр18лр18
лр18
 
лр15
лр15лр15
лр15
 

Lecture 4

  • 1. Прикладное программирование кафедра прикладной и компьютерной оптики Наследование
  • 2. 2 Наследование Наследование – такое отношение между классами когда один из них наследует (повторяет) структуру и поведение другого  cодержание (переменные-члены)  поведение (функции-члены)
  • 3. 3 Пример наследования: линза и зеркало class Lens { Position m_p; Media m_media; double m_R1, m_R2; double m_d, m_D; }; class Mirror { Position m_p; double m_R; double m_D; };
  • 4. 4 Пример наследования: деталь // базовый класс class Detail { protected: Position m_p; double m_D; }; // класс-наследник class Lens : public Detail { private: Media m_media; double m_R1, m_R2; double m_d; }; // класс-наследник class Mirror : public Detail { private: double m_R; }; См. пример программы
  • 5. 5 Доступ к членам класса public (открытые) protected (защищенные) private (закрытые) функции-члены и друзья класса + + + функции-члены и друзья производных классов + + – пользователи + – –
  • 6. 6 Типы наследования class X : public Y;  наследник является подтипом и выполняет все обязательства родителя  допустимо преобразование X* в Y* class X : private Y;  наследник не будет подтипом родителя  public и protected члены родителя станут private членами наследника  преобразование X* в Y* допустимо для друзей и членов X  последующее наследование не имеет смысла class X : protected Y;  наследник не будет подтипом родителя  public и protected члены родителя станут protected членами наследника  преобразование X* в Y* допустимо для членов и друзей и наследников X
  • 7. 7 Доступ к переменным-членам базового класса public (открытые) protected (защищенные) private (закрытые) public-наследование public protected недоступны protected-наследование protected protected недоступны private-наследование private private недоступны См. пример программы
  • 8. 8 Последовательность вызовов конструкторов и деструкторов При создании экземпляра класса Lens  сначала вызовется конструктор базового класса Detail()  потом конструктор класса Lens() При разрушении экземпляра класса Lens деструкторы будут вызваны в обратном порядке:  сначала деструктор наследника ~Lens()  потом деструктор базового класса ~Detail() В конструкторе наследника с параметрами следует вызывать конструктор базового класса  (по умолчанию будет вызван конструктор базового класса без параметров) См. пример программы
  • 9. 9 Множественное наследование class Child : public Base1, public Base2 { public: Child(); ~Child(); };  при создании экземпляра класса Child: Base1(), Base2(), Child()  при разрушении экземпляра класса Child: ~Child(), ~Base2(), ~Base1() class Base1 { public: Base1(); ~Base1(); }; class Base2 { public: Base2(); ~Base2(); };
  • 10. 10 Виртуальные функции Виртуальные функции – функции базового класса, которые можно заместить в каждом производном классе  позволяют избавиться от переменных-членов, представляющих собой флаг или тип отвечающий за внутреннее строение класса  всегда будет вызываться функция наследника
  • 11. 11 Виртуальная функция в базовом классе class Detail { public: virtual void print() const; }; ////////////////////////////////////////////// void main () { // виртуальные функции важны, когда создаются указатели на класс Detail *p=new Lens; } См. пример программы
  • 12. 12 Перегруженные функции в классах-наследниках Detail *l=new Lens; Если должны вызываться "родные" функции-члены классов, то используется обычная перегрузка l.print(); // Detail::print Если функция-член базового класса должна подменяться функцией-членом класса-наследника, то при ее объявлении используется модификатор virtual l.print(); // Lens::print Если должны вызываться последовательно обе функции, то это необходимо сделать принудительно вызвав функцию-член базового класса Detail::print();
  • 13. 13 Виртуальные деструкторы class Shape { public: Shape() { }; virtual ~Shape() { }; }; ////////////////////////// void main() { Shape* s=new Polygon(); ... delete s; } class Polygon : public Shape { private: Point* m_points; public: Polygon(int n) { m_points=new Point[n]; }; ~Polygon() { delete [] m_points; }; }; См. пример программы
  • 14. 14 Абстрактные классы Абстрактный класс – класс, имеющий чисто виртуальные функции  чисто виртуальная функция – функция не определена в базовом классе, и обязательно должна быть перегружена в наследниках  экземпляр абстрактного класса создать нельзя, но можно создать экземпляры его наследников // чисто виртуальный класс Деталь class Detail { protected: double m_z, m_D; public: // ... // вычисление хода луча virtual void RayTrace() = 0; }; См. пример программы