SlideShare a Scribd company logo
C++ : наследование, часть 1 Дмитрий Штилерман, Рексофт
Краткое содержание первой части Открытое наследование (public inheritance) как отношение "is-a” . Иерархическая и другие виды классификаций. Отношение “is-a” - возможные ошибки проектирования и способы их предотвращения. Наследование интерфейса и наследование реализации. Применение виртуальных методов.
Открытое наследование (public inheritance) - отношение "is-a" class Person {}; class Student : public Person {}; class Teacher : public Person {}; void f(Person&)  {…} void g()  {   Student s;   Teacher t;   f(s);   f(t);  } Отношение “is-a”  организует объекты в виде  иерархической  классификации.
Виды классификаций А какие бывают классификации? Иерархическая Комбинативная Параметрическая Смешанные (на разных уровнях - разные виды) А.А.Любищев, «О форме естественной системы организмов»
Виды классификаций - иерархическая К лассы находятся в отношении “надкласс-подкласс”. Каждый класс имеет характерные признаки, присущие только ему из всех его «братьев». Пример: систематика живых организмов. Выбор признаков определяет стратегию классификации. Примеры стратегий: Филогенетическая  (общность определяется происхождением). Морфологическая  (общность определяется формой). Млекопитающие Выкармливают детенышей молоком Приматы Всеядные, зубная система гетеродонтная, глаза направлены вперед Высшие обезьяны Нет хвоста
Виды классификаций - комбинативная Принадлежность к классу определяется  значения ми некоторых признаков. Признаки могут сочетаться произвольным образом . Пример: матрица  Boston Consulting Group  для оценки компаний . Высокие темпы роста Знаки вопроса Звезды Дойные коровы Собаки Низ кие темпы роста Большая доля рынка Малая доля рынка ???
Виды классификаций - параметрическая Принадлежность к классу определяется значениями немногих существенных параметров. Большинство характеристик объекта коррелирует с существенными параметрами. Пример: периодическая система элементов (существенный параметр - атомный вес) .
Отношение “is-a” -  как можно ошибиться? (1) class StupidBird  {public: virtual void fly() = 0;}; class StupidEagle : public StupidBird  {public: virtual void fly();}; class StupidPenguin : public StupidBird  {public: virtual void fly();}; Пингвины не умеют летать. Как мы собираемся реализовывать Stupid Penguin::fly()?
Отношение “is-a” -  как можно ошибиться? (2) class Rectangle  {   public:   int getHeight() const;   virtual void setHeight(int);   int getWidth() const;   virtual void setWidth(int);  }; void RectangleTest(Rectangle& r)  {   r.setHeight(4);    r.setWidth(5);   int S = r.getHeight()*r.getWidth();    assert(S==20);   } class Square : public Rectangle  {   public:   void setHeight(int h)   {   Rectangle::setHeight(h);   Rectangle::setWidth(h);   }   void setWidth(int w)   {   Rectangle::setWidth(w);   Rectangle::setHeight(w);   }  };
Отношение “is-a” -  как не ошибиться? Важно поведение объекта, а не классификация, действующая в предметной области. Все, верное для базового класса, должно быть верным и для производного. Интерфейс класса должен быть полным и минимальным.
Отношение “is-a” -  The Liskov Substitution Principle If for each object o 1  of type S there is an object o 2  of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o 1  is substituted for o 2  then S is a subtype of T. Barbara Liskov, “Data Abstraction & Hierarchy” An object-oriented function that uses pointers or references to a base class must be able to use objects of derived classes without knowing it. Robert C. Martin, “The Liskov Substitution Principle”
Отношение “is-a” -  как исправить ошибку? (1) В рамках задачи неверно утверждение «все птицы умеют летать». Значит, неправильно делать  fly()  методом Bird. Решение из обычного орнитологического определителя: дополнительная теза-антитеза «летает - не летает».
Отношение “is-a” -  как исправить ошибку? (2) class Rectangular  {   public:   virtual int getHeight() const = 0;   virtual int getWidth() const = 0;  }; class Square : public Rectangular  {   public:   virtual int getHeight() const;   virtual int getWidth() const;   void setSide(int s);  }; class Rectangle : public Rectangular  {   public:   virtual int getHeight() const;   virtual int getWidth() const;   void setHeight(int h);   void setWidth(int w);  };
Наследование интерфейса и наследование реализации При проектировании базовых и производных классов важно различать наследование интерфейса и реализации. Можно наследовать то и другое как по отдельности, так и вместе. Конкретная семантика наследования естественно определяется типом метода. Метод м.б. чисто виртуальный, виртуальный, невиртуальный.
Наследование интерфейса class Shape  {public: virtual void draw() = 0;}; class Circle : public Shape  {public: virtual void draw();}; class Rectangle : public Shape  {public: virtual void draw();}; Каждая фигура должна уметь себя нарисовать, следовательно метод  draw() должен входить в интерфейс Shape . Невозможно нарисовать «фигуру вообще», следовательно  Shape::draw()  не может иметь реализации. Pure virtual function
Наследование интерфейса и обязательной реализации class Shape  {   public:    virtual void draw() = 0;   virtual void erase() = 0;   bool getVisible() const   {return m_bVisible;}   void setVisible(bool bVisible)   {   m_bVisible = bVisible;   if(m_bVisible)   draw();   else   erase();    }   private:   bool m_bVisible;  }; Каждую фигуру можно показать или спрятать, используя метод  setVisible() . Протокол, по которому работает метод  setVisible() , должен быть одним и тем же для всех производных классов. Non-virtual function See also: Template Method pattern
Наследование интерфейса и реализации по умолчанию (1) class Shape  {   public:    virtual void draw() = 0;   virtual void erase() = 0;   virtual void redraw()   {   /*  Простейший способ/    erase(); draw();   }  }; class Sprite : public Shape  {   public:   virtual void redraw()   {/* Оптимизированный способ*/}  }; Изображение каждой фигуры можно обновить, используя метод  redraw() . Существует простейший  всегда работающий  способ перерисовки. Для конкретных производных классов может существовать лучший (например, более быстрый) способ перерисовки. Virtual function
Наследование интерфейса и реализации по умолчанию (2) class Shape  {   public:    virtual void redraw() = 0;   protected:   void default_redraw()   {erase(); draw();}  }; class Rectangle : public Shape  {   public:   virtual void redraw()   {default_redraw();}  }; class Sprite : public Shape  {   public:   virtual void redraw()   {/*Оптимизированный способ*/}  }; Изображение каждой фигуры можно обновить, используя метод  redraw() . Существует способ перерисовки,  работающий часто, но не всегда . Каждый производный класс обязан реализовать  redraw() , возможно используя реализацию по умолчанию. Pure virtual function & Protected non-virtual function
Продолжение в следующей серии Public & protected interface . Случаи видимости наследования ( public, protected, private)  и их семантика. О тношения “has-a”  и  “is-implemented-by”. Композиция (aggregation). Делегирование ( delegation) . Изоляция ( insulation ).

More Related Content

PDF
Social Bookmarks, Folksonomies–Complex Networks
PDF
Intro To RDBMS And SQL Server 2005 - Svetlin Nakov
PDF
Jazz – открытая платформа разработки ПО
PDF
за Ruby
PPT
Hackday Ml
PPTX
Minsk Jazz 190509 Templ
PDF
Java For Digitally Signing Documents In Web Book - Svetlin Nakov
PDF
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 146
Social Bookmarks, Folksonomies–Complex Networks
Intro To RDBMS And SQL Server 2005 - Svetlin Nakov
Jazz – открытая платформа разработки ПО
за Ruby
Hackday Ml
Minsk Jazz 190509 Templ
Java For Digitally Signing Documents In Web Book - Svetlin Nakov
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 146

What's hot (19)

PDF
IBM Jazz - A New Approach For Software Development (In Russian)
PPTX
Taleb's Black Swan - SG 20090520
PDF
норма санпин
PDF
Управление рисками ИБ: отдельные практические аспекты
PDF
Принцип Парето в стандартизации ИБ
PDF
Background Examples From Eu Ru
PDF
Обеспечение безопасности web приложений
PDF
Сегментация рынка и сегментационные исследования
PDF
Библейские истории: Животные
PDF
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1968
PDF
Postgre Sql 8 4
PDF
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2657
PPTX
Minsk Overview 190509 Tmpl
PDF
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716
PDF
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4397
PDF
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704
PDF
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
PDF
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103
PDF
greek doc 1
IBM Jazz - A New Approach For Software Development (In Russian)
Taleb's Black Swan - SG 20090520
норма санпин
Управление рисками ИБ: отдельные практические аспекты
Принцип Парето в стандартизации ИБ
Background Examples From Eu Ru
Обеспечение безопасности web приложений
Сегментация рынка и сегментационные исследования
Библейские истории: Животные
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 1968
Postgre Sql 8 4
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2657
Minsk Overview 190509 Tmpl
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4397
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3704
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4103
greek doc 1
Ad

Similar to OO Design with C++: 1. Inheritance, part 1 (20)

PDF
L10
PPTX
Polymorphismupload
PPTX
pointers,virtual functions and polymorphism
DOC
04cpp inh
PPT
Lec 42.43 - virtual.functions
PPTX
OOPS Basics With Example
DOC
Virtual inheritance
PDF
Polymorphism
DOCX
Bc0037
PDF
CS225_Prelecture_Notes 2nd
PPTX
Pointers,virtual functions and polymorphism cpp
PPT
C++ polymorphism
PPT
this is the concept in C++ under object oriented programming language "POLYMO...
PDF
Object Oriented Programming notes provided
PPT
Inheritance, polymorphisam, abstract classes and composition)
PPTX
OOPS & C++(UNIT 4)
PPT
Polymorphism.pptthis is oops one of the most important feature polymorphism
KEY
Mysterious c++
PPTX
Presentations_PPT_ Unit-6_OOP.pptx
PPTX
C++ Object Oriented Programming
L10
Polymorphismupload
pointers,virtual functions and polymorphism
04cpp inh
Lec 42.43 - virtual.functions
OOPS Basics With Example
Virtual inheritance
Polymorphism
Bc0037
CS225_Prelecture_Notes 2nd
Pointers,virtual functions and polymorphism cpp
C++ polymorphism
this is the concept in C++ under object oriented programming language "POLYMO...
Object Oriented Programming notes provided
Inheritance, polymorphisam, abstract classes and composition)
OOPS & C++(UNIT 4)
Polymorphism.pptthis is oops one of the most important feature polymorphism
Mysterious c++
Presentations_PPT_ Unit-6_OOP.pptx
C++ Object Oriented Programming
Ad

More from Dmitry Stillermann (8)

PPTX
DiSC Model in Practice
PPTX
Как расти самому, помогая расти другим — практическое применение Management T...
PPT
OO Design with C++: 4. Design Principles, part 1
PPT
OO Design with C++: 5. Design Principles, part 2
PPT
OO Design with C++: 3. Inheritance, part 3
PPT
OO Design with C++: 2. Inheritance, part 2
PPT
OO Design with C++: 6. Templates & Patterns
PPT
OO Design with C++: 0. Intro
DiSC Model in Practice
Как расти самому, помогая расти другим — практическое применение Management T...
OO Design with C++: 4. Design Principles, part 1
OO Design with C++: 5. Design Principles, part 2
OO Design with C++: 3. Inheritance, part 3
OO Design with C++: 2. Inheritance, part 2
OO Design with C++: 6. Templates & Patterns
OO Design with C++: 0. Intro

Recently uploaded (20)

PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Electronic commerce courselecture one. Pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPT
Teaching material agriculture food technology
PDF
Encapsulation theory and applications.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Empathic Computing: Creating Shared Understanding
PDF
cuic standard and advanced reporting.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
Programs and apps: productivity, graphics, security and other tools
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Review of recent advances in non-invasive hemoglobin estimation
Electronic commerce courselecture one. Pdf
Encapsulation_ Review paper, used for researhc scholars
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Teaching material agriculture food technology
Encapsulation theory and applications.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Empathic Computing: Creating Shared Understanding
cuic standard and advanced reporting.pdf
Big Data Technologies - Introduction.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Digital-Transformation-Roadmap-for-Companies.pptx
The AUB Centre for AI in Media Proposal.docx

OO Design with C++: 1. Inheritance, part 1

  • 1. C++ : наследование, часть 1 Дмитрий Штилерман, Рексофт
  • 2. Краткое содержание первой части Открытое наследование (public inheritance) как отношение "is-a” . Иерархическая и другие виды классификаций. Отношение “is-a” - возможные ошибки проектирования и способы их предотвращения. Наследование интерфейса и наследование реализации. Применение виртуальных методов.
  • 3. Открытое наследование (public inheritance) - отношение "is-a" class Person {}; class Student : public Person {}; class Teacher : public Person {}; void f(Person&) {…} void g() { Student s; Teacher t; f(s); f(t); } Отношение “is-a” организует объекты в виде иерархической классификации.
  • 4. Виды классификаций А какие бывают классификации? Иерархическая Комбинативная Параметрическая Смешанные (на разных уровнях - разные виды) А.А.Любищев, «О форме естественной системы организмов»
  • 5. Виды классификаций - иерархическая К лассы находятся в отношении “надкласс-подкласс”. Каждый класс имеет характерные признаки, присущие только ему из всех его «братьев». Пример: систематика живых организмов. Выбор признаков определяет стратегию классификации. Примеры стратегий: Филогенетическая (общность определяется происхождением). Морфологическая (общность определяется формой). Млекопитающие Выкармливают детенышей молоком Приматы Всеядные, зубная система гетеродонтная, глаза направлены вперед Высшие обезьяны Нет хвоста
  • 6. Виды классификаций - комбинативная Принадлежность к классу определяется значения ми некоторых признаков. Признаки могут сочетаться произвольным образом . Пример: матрица Boston Consulting Group для оценки компаний . Высокие темпы роста Знаки вопроса Звезды Дойные коровы Собаки Низ кие темпы роста Большая доля рынка Малая доля рынка ???
  • 7. Виды классификаций - параметрическая Принадлежность к классу определяется значениями немногих существенных параметров. Большинство характеристик объекта коррелирует с существенными параметрами. Пример: периодическая система элементов (существенный параметр - атомный вес) .
  • 8. Отношение “is-a” - как можно ошибиться? (1) class StupidBird {public: virtual void fly() = 0;}; class StupidEagle : public StupidBird {public: virtual void fly();}; class StupidPenguin : public StupidBird {public: virtual void fly();}; Пингвины не умеют летать. Как мы собираемся реализовывать Stupid Penguin::fly()?
  • 9. Отношение “is-a” - как можно ошибиться? (2) class Rectangle { public: int getHeight() const; virtual void setHeight(int); int getWidth() const; virtual void setWidth(int); }; void RectangleTest(Rectangle& r) { r.setHeight(4); r.setWidth(5); int S = r.getHeight()*r.getWidth(); assert(S==20); } class Square : public Rectangle { public: void setHeight(int h) { Rectangle::setHeight(h); Rectangle::setWidth(h); } void setWidth(int w) { Rectangle::setWidth(w); Rectangle::setHeight(w); } };
  • 10. Отношение “is-a” - как не ошибиться? Важно поведение объекта, а не классификация, действующая в предметной области. Все, верное для базового класса, должно быть верным и для производного. Интерфейс класса должен быть полным и минимальным.
  • 11. Отношение “is-a” - The Liskov Substitution Principle If for each object o 1 of type S there is an object o 2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o 1 is substituted for o 2 then S is a subtype of T. Barbara Liskov, “Data Abstraction & Hierarchy” An object-oriented function that uses pointers or references to a base class must be able to use objects of derived classes without knowing it. Robert C. Martin, “The Liskov Substitution Principle”
  • 12. Отношение “is-a” - как исправить ошибку? (1) В рамках задачи неверно утверждение «все птицы умеют летать». Значит, неправильно делать fly() методом Bird. Решение из обычного орнитологического определителя: дополнительная теза-антитеза «летает - не летает».
  • 13. Отношение “is-a” - как исправить ошибку? (2) class Rectangular { public: virtual int getHeight() const = 0; virtual int getWidth() const = 0; }; class Square : public Rectangular { public: virtual int getHeight() const; virtual int getWidth() const; void setSide(int s); }; class Rectangle : public Rectangular { public: virtual int getHeight() const; virtual int getWidth() const; void setHeight(int h); void setWidth(int w); };
  • 14. Наследование интерфейса и наследование реализации При проектировании базовых и производных классов важно различать наследование интерфейса и реализации. Можно наследовать то и другое как по отдельности, так и вместе. Конкретная семантика наследования естественно определяется типом метода. Метод м.б. чисто виртуальный, виртуальный, невиртуальный.
  • 15. Наследование интерфейса class Shape {public: virtual void draw() = 0;}; class Circle : public Shape {public: virtual void draw();}; class Rectangle : public Shape {public: virtual void draw();}; Каждая фигура должна уметь себя нарисовать, следовательно метод draw() должен входить в интерфейс Shape . Невозможно нарисовать «фигуру вообще», следовательно Shape::draw() не может иметь реализации. Pure virtual function
  • 16. Наследование интерфейса и обязательной реализации class Shape { public: virtual void draw() = 0; virtual void erase() = 0; bool getVisible() const {return m_bVisible;} void setVisible(bool bVisible) { m_bVisible = bVisible; if(m_bVisible) draw(); else erase(); } private: bool m_bVisible; }; Каждую фигуру можно показать или спрятать, используя метод setVisible() . Протокол, по которому работает метод setVisible() , должен быть одним и тем же для всех производных классов. Non-virtual function See also: Template Method pattern
  • 17. Наследование интерфейса и реализации по умолчанию (1) class Shape { public: virtual void draw() = 0; virtual void erase() = 0; virtual void redraw() { /* Простейший способ/ erase(); draw(); } }; class Sprite : public Shape { public: virtual void redraw() {/* Оптимизированный способ*/} }; Изображение каждой фигуры можно обновить, используя метод redraw() . Существует простейший всегда работающий способ перерисовки. Для конкретных производных классов может существовать лучший (например, более быстрый) способ перерисовки. Virtual function
  • 18. Наследование интерфейса и реализации по умолчанию (2) class Shape { public: virtual void redraw() = 0; protected: void default_redraw() {erase(); draw();} }; class Rectangle : public Shape { public: virtual void redraw() {default_redraw();} }; class Sprite : public Shape { public: virtual void redraw() {/*Оптимизированный способ*/} }; Изображение каждой фигуры можно обновить, используя метод redraw() . Существует способ перерисовки, работающий часто, но не всегда . Каждый производный класс обязан реализовать redraw() , возможно используя реализацию по умолчанию. Pure virtual function & Protected non-virtual function
  • 19. Продолжение в следующей серии Public & protected interface . Случаи видимости наследования ( public, protected, private) и их семантика. О тношения “has-a” и “is-implemented-by”. Композиция (aggregation). Делегирование ( delegation) . Изоляция ( insulation ).

Editor's Notes

  • #2: Public vs. protected interface - two types of clients {part. Meyers1.41}. Containment as "has-a" or "is-implemented-via" relationship {Meyers1.40} Private inheritance - reasons of use instead of containment {Meyers1.42}