1 / 27

Композиция, наследование и полиморфизм Лекция №5

Композиция, наследование и полиморфизм Лекция №5. Композиция. class List { public: List(); void addToFront (int); int size(); bool inc(int); }; public Set { public: Set(); void add (int); int size(); private: List Data; };.

Télécharger la présentation

Композиция, наследование и полиморфизм Лекция №5

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Композиция, наследование и полиморфизм Лекция №5 ВГУЭС

  2. Композиция class List {public: List(); void addToFront (int); int size(); bool inc(int); }; public Set {public: Set(); void add (int); int size();private: List Data;}; Set::Set(): Data() {}int Set::size() { return Data.size(); }void Set::add (int a) { if(Data.inc(a)== false) Data.addToFront(a);} Set s; s.add(1); s.add(2); //ok s.addToFront(); // error ВГУЭС

  3. Наследование class List {public: List(); void addToFront (int); int size(); bool inc(int); }; public Set : private List {public: Set(); void add (int); int size();}; Set::Set(): List() {}int Set::size() { return List::size(); }void Set::add (int a) { if(inc(a)== false) addToFront(a);} Set s; s.add(1); s.add(20); //ok s.addToFrant(1); //error ВГУЭС

  4. Наследование и композиция в Java class List {public List() {}public void addToFront (int){}public int size() {}public boolean inc(int) {} }; public Set extends List {public Set() { super (); }public void add (int a) { if (((List)this).inc(a)==false) super.addToFront(a); }int size() {return super.size(); } };Set s=new Set(); s.add(1); // oks.addToFront(2) ; // ok ВГУЭС

  5. Наследование и композиция в Java class List {public List() {}public void addToFront (int){}public int size() {}public boolean inc(int) {} }public Set {private List Data;public Set() { Data=new List (); }public void add (int a) { if (Data.inc(a)==false) Data.addToFront(a); }int size() {return Data.size(); } };Set s=new Set(); s.add(1); // oks.addToFront(2) ; // error ВГУЭС

  6. Наследованиеи композиция • Композиция более проста. Видно какие точно операции будут выполняться. Все операции описан в протоколе класса • Наследование более сложное, чтобы знать все поведение производного класса надо изучить все базовые • И наследование и композиция позволяют повторно использовать код • Полиморфизм отсутствует в композиции • Производительность выше в наследовании ВГУЭС

  7. Полиморфизм Shape * s[10];s[0]=new Triangle (2); s[1]=new Circle (10); s[2]=new Rect(11); Float AllSquar=Cal_square(s, 3);float Cal_square (Shape **s, int n) { float ss; for(int i=0, ss=0; i<n ; i++) ss+=s[i]->square(); return ss; }for(int i=0; i<3 ; i++) delete s[i]; s[0]=new Circle (2); s[1]=new Rect (10); s[2]=new Triangle(11); AllSquar+=Cal_square(s, 3); ВГУЭС

  8. Полиморфизм class Shape {public: virtual float square () { return 0; } };class Circle : public Shape {public: virtual float square() { return 2 * pi * r *r; } }; class Triangle : public Shape {public: virtual float square() { return a *b/2.; } }; class Rect : public Shape {public: virtual float square() { return a *b; } }; ВГУЭС

  9. Абстрактный базовый класс class Shape {public: virtual float square () =0; };class Circle : public Shape {public: virtual float square() { return 2 * pi * r *r; } }; class Triangle : public Shape {public: virtual float square() { return a *b/2.; } }; class Rect : public Shape {public: virtual float square() { return a *b; } }; Shape *s=new Shape(); // error Shape *s = new Circle(); // ok ВГУЭС

  10. Виртуальный деструктор class Vector {public: Vector() { v=new int [10]; } ~List() { delete [] v;} };class Vector_out : public Vector {public: ~Vector_out() { delete x;}};Vector *v=new Vector_out(); delete v; // x – остается class Vector {public: Vector() { v=new int [10]; } virtual ~List() { delete [] v;} }; ВГУЭС

  11. Полиморфизм в Java class Shape {public float square(){}}class Circle extends Shape{public float square() { return 2 * pi *r *r; }} class Triangle extends Shape{public float square() { return a * b/2.; }} Shape s=new Shape (); s.square();s=new Circle(); s.square(); s=new Triangle(); s.square(); float Calc_square(Shape [] s, int n) { float ss=0;for(int i=0i < n ; i++) ss+=s.square(); return ss; } ВГУЭС

  12. Абстрактный класс в Java abstract class Shape {public float square();}class Circle extends {public float square() { return 2 * pi *r *r; }} Shape s=new Shape (); // errorShape s=new Circle(); //OK abstract class Shape {abstract public float square();}Shape s=new Circle(); s.square(); s=new Rect(); s=s.square(); ВГУЭС

  13. Реализация интерфейса в Java Interface dataBase {int read();int write();}class Man {public int print() {} } class Student extends Man implements dataBase{public int read() {}public int write() {}public int print() {}; } class Course implements dataBase{public int read() {}public int write() {}} Man m=new Student(); m.print(); // Student.print();dataBase d=new Student(); d.read(); d.write(); d=new Course(); d.read(); d.write(); ВГУЭС

  14. Замещение и уточнение class Man {public: virtual void print();}; class Student : public Man {public: virtual void print() { Man::print(); …..} // уточнение }; class Teacher : public Man {public: virtual void print() {} // замещение }; ВГУЭС

  15. Присваивание class base {public: virtual void see();};class derived : public base {public: virtual void see();};void f (base );void g (base &);derived z; z.see(); // derived::see f(z); // base:: see g(z); // derived:: see ВГУЭС

  16. Проверка на равенство Что сравнивать адрес ? Или значения ? По байтово ? Структура (класс) имеет пустые участки class Man {}; class Student : public Man {}; Student *s=new Student();Man *m=s;if( *m == *s) ? (if m==s) ? ВГУЭС

  17. Проверка на равенство class Shape {public:bool operator==(Shape &c) { return false; }}; class Triangle : public Shape {public:bool operator==(Triangle &c) { return ; }}; class Circle : public Shape {public:bool operator==(Cicle &c) { return ; }}; Shape a, * pa, *pa1;Triangle b, *pb;Circle c, *pc;a==a; // Shape::operator==(a);b==b; c==c; a==b;// Shape::operator==(b)b==a; // errorpb =&b; pa=&a; pc=&c; *pa==(*pb); // Shape==(b)pa=pb *pa==(*pb); // Shape==(b) – Треуг. *pb==(*pa)// errorpa=pc; pa1=pb;pa1==pa; // Возможно сравнить треугольник с кругом ВГУЭС

  18. Таблица виртуальных функций Интерпретация сообщения зависит от типа получателя. Поэтому объект должен содержать способ определения, какой метод должен вызываться в ответ на сообщение Для всех экземпляров одного класса существует таблица виртуальных методов. Все объекты содержат указатель на эту таблицу. И вызов методов происходит через эту таблицу. Значения полей в таблице виртуальных функций – это указатели на методы. Таблица виртуальных методов базового класса входит во все таблицы производных классов ВГУЭС

  19. Таблица виртуальных функций Class Base { int x;public: virtual void print ();};class Derived1 : public Base { int y;public: virtual void print(int); int get();}; Vtab – указатель на таблицу виртуальных функций Derived d; d.print(y); => (*(*(d.vtab) ))[1](d,y); ВГУЭС

  20. Множественное наследование class Student {public: Student(); };class Teacher {public: Teacher();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {}}; ВГУЭС

  21. Множественное наследование class Student {public: Student(); virtual void print() {} };class Teacher {public: Teacher();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {} void print () {}}; Student * s; S=new Student(); S->print(); // student::print()s=new Aspirant(); S->print(); // Aspirant::print ВГУЭС

  22. Множественное наследование- конфликт имен class Student {public: Student(); virtual void print() {} };class Teacher {public: Teacher();virtual void print();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {} void print () { Student::print(); Teacher::print(); }}; Student * s; S=new Student(); S->print(); // student::print()s=new Aspirant(); S->print(); // Aspirant::print ВГУЭС

  23. Множественное наследование- конфликт имен class Student {public: Student(); virtual void print() {} };class Teacher {public: Teacher();virtual void print();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {} }; Student * s; S=new Student(); S->print(); // student::print()s=new Aspirant(); S->print(); // error – какой print()? ((Teacher *)s)->print(); //OK ВГУЭС

  24. Множественное наследование- конфликт имен class Student {protected: string fio;public: Student(); virtual void print() {}};class Teacher {protected: string fio;public: Teacher();virtual void print();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {} void print() { cout << fio; // error cout <<Student::fio; } }; ВГУЭС

  25. Множественное наследование-виртуальные базовые классы class Student : virtual public Man {public: Student(); Student (string s); virtual void print() {}};class Teacher : virtual public Man {public: Teacher(); Teacher (string s); virtual void print();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {} Aspirant (string fio): Man(fio), Student (fio), Teacher(fio) {} }; Class Man { string fio;public: Man() {} Man (string s): fio(s) {} }; ВГУЭС

  26. Множественное наследование-виртуальные базовые классы Man fio Virtual Virtual Student Teacher Virtual Aspirant ВГУЭС

  27. Множественное наследование-Не виртуальные базовые классы Man fio Man fio Student Teacher Aspirant ВГУЭС

More Related