280 likes | 294 Views
Композиция, наследование и полиморфизм Лекция №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; };.
E N D
Композиция, наследование и полиморфизм Лекция №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;}; 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 ВГУЭС
Наследование 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 ВГУЭС
Наследование и композиция в 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 ВГУЭС
Наследование и композиция в 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 ВГУЭС
Наследованиеи композиция • Композиция более проста. Видно какие точно операции будут выполняться. Все операции описан в протоколе класса • Наследование более сложное, чтобы знать все поведение производного класса надо изучить все базовые • И наследование и композиция позволяют повторно использовать код • Полиморфизм отсутствует в композиции • Производительность выше в наследовании ВГУЭС
Полиморфизм 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); ВГУЭС
Полиморфизм 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; } }; ВГУЭС
Абстрактный базовый класс 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 ВГУЭС
Виртуальный деструктор 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;} }; ВГУЭС
Полиморфизм в 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; } ВГУЭС
Абстрактный класс в 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(); ВГУЭС
Реализация интерфейса в 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(); ВГУЭС
Замещение и уточнение class Man {public: virtual void print();}; class Student : public Man {public: virtual void print() { Man::print(); …..} // уточнение }; class Teacher : public Man {public: virtual void print() {} // замещение }; ВГУЭС
Присваивание 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 ВГУЭС
Проверка на равенство Что сравнивать адрес ? Или значения ? По байтово ? Структура (класс) имеет пустые участки class Man {}; class Student : public Man {}; Student *s=new Student();Man *m=s;if( *m == *s) ? (if m==s) ? ВГУЭС
Проверка на равенство 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; // Возможно сравнить треугольник с кругом ВГУЭС
Таблица виртуальных функций Интерпретация сообщения зависит от типа получателя. Поэтому объект должен содержать способ определения, какой метод должен вызываться в ответ на сообщение Для всех экземпляров одного класса существует таблица виртуальных методов. Все объекты содержат указатель на эту таблицу. И вызов методов происходит через эту таблицу. Значения полей в таблице виртуальных функций – это указатели на методы. Таблица виртуальных методов базового класса входит во все таблицы производных классов ВГУЭС
Таблица виртуальных функций 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); ВГУЭС
Множественное наследование class Student {public: Student(); };class Teacher {public: Teacher();};class Aspirant : public Student, public Teacher {public: Aspirant():Teacher(), Student() {}}; ВГУЭС
Множественное наследование 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 ВГУЭС
Множественное наследование- конфликт имен 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 ВГУЭС
Множественное наследование- конфликт имен 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 ВГУЭС
Множественное наследование- конфликт имен 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; } }; ВГУЭС
Множественное наследование-виртуальные базовые классы 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) {} }; ВГУЭС
Множественное наследование-виртуальные базовые классы Man fio Virtual Virtual Student Teacher Virtual Aspirant ВГУЭС
Множественное наследование-Не виртуальные базовые классы Man fio Man fio Student Teacher Aspirant ВГУЭС