class List public List void add To Front
Композиция class List { public: List(); void add. To. Front (int); int size(); bool inc(int); }; Set: : Set(): Data() {} int Set: : size() { return Data. size(); } void Set: : add (int a) { if(Data. inc(a)== false) public Set { public: Set(); void add (int); int size(); private: List Data; 25. 09. 2020 }; } Data. add. To. Front(a); Set s; s. add(1); s. add(2); //ok s. add. To. Front(); // error ВГУЭС 2
Наследование class List { public: List(); void add. To. Front (int); int size(); bool inc(int); }; Set: : Set(): List() {} int Set: : size() { return List: : size(); } void Set: : add (int a) { if(inc(a)== false) public Set : private List { public: Set(); void add (int); int size(); }; } 25. 09. 2020 add. To. Front(a); Set s; s. add(1); s. add(20); //ok s. add. To. Frant(1); //error ВГУЭС 3
Наследование и композиция в Java class List { public List() {} public void add. To. Front (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. add. To. Front(a); } int size() {return super. size(); } }; Set s=new Set(); s. add(1); // ok 25. 09. 2020 ВГУЭС s. add. To. Front(2) ; // ok 4
Наследование и композиция в Java class List { public List() {} public void add. To. Front (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. add. To. Front(a); } int size() {return Data. size(); } }; Set s=new Set(); s. add(1); // ok s. add. To. Front(2) ; // error 25. 09. 2020 ВГУЭС 5
Полиморфизм Shape * s[10]; s[0]=new Triangle (2); s[1]=new Circle (10); s[2]=new Rect(11); Float All. Squar=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); All. Squar+=Cal_square(s, 3); 25. 09. 2020 ВГУЭС 7
Полиморфизм 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; } }; 25. 09. 2020 ВГУЭС 8
Абстрактный базовый класс class Shape { Shape *s=new Shape(); // error public: Shape *s = new Circle(); // ok 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; } }; 25. 09. 2020 ВГУЭС 9
Виртуальный деструктор 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; } }; 25. 09. 2020 ВГУЭС 10
Полиморфизм в Java class Shape { public float square() {} } class Circle extends Shape{ public float square() { return 2 * pi *r *r; } } Shape s=new Shape (); s. square(); s=new Circle(); s. square(); s=new Triangle(); s. square(); class Triangle extends Shape{ public float square() { return a * b/2. ; } } float Calc_square(Shape [] s, int n) { float ss=0; for(int i=0 i < n ; i++) ss+=s. square(); return ss; 11 } 25. 09. 2020 ВГУЭС
Абстрактный класс в Java abstract class Shape { public float square(); } class Circle extends { public float square() { return 2 * pi *r *r; } } Shape s=new Shape (); // error Shape s=new Circle(); //OK abstract class Shape { abstract public float square(); } Shape s=new Circle(); s. square(); s=new Rect(); s=s. square(); 25. 09. 2020 ВГУЭС 12
Реализация интерфейса в Java Interface data. Base { int read(); int write(); } class Man { public int print() {} } class Student extends Man implements data. Base { public int read() {} public int write() {} public int print() {}; } 25. 09. 2020 class Course implements data. Base { public int read() {} public int write() {} } Man m=new Student(); m. print(); // Student. print(); data. Base d=new Student(); d. read(); d. write(); d=new Course(); d. read(); d. write(); ВГУЭС 13
Замещение и уточнение class Man { public: virtual void print(); }; class Student : public Man { public: virtual void print() { Man: : print(); …. . } // уточнение }; class Teacher : public Man { public: virtual void print() {} // замещение }; 25. 09. 2020 ВГУЭС 14
Присваивание 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 25. 09. 2020 ВГУЭС 15
Проверка на равенство 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 ; } }; 25. 09. 2020 ВГУЭС Shape a, * pa, *pa 1; Triangle b, *pb; Circle c, *pc; a==a; // Shape: : operator==(a); b==b; c==c; a==b; // Shape: : operator==(b) b==a; // error pb =&b; pa=&a; pc=&c; *pa==(*pb); // Shape==(b) pa=pb *pa==(*pb); // Shape==(b) – Треуг. *pb==(*pa)// error pa=pc; pa 1=pb; pa 1==pa; // Возможно сравнить треугольник с кругом 17
Таблица виртуальных функций Class Base { int x; public: virtual void print (); }; class Derived 1 : public Base { int y; public: virtual void print(int); int get(); }; 25. 09. 2020 Vtab – указатель на таблицу виртуальных функций Derived d; d. print(y); => (*(*(d. vtab) ))[1](d, y); ВГУЭС 19
Множественное наследование class Student { public: Student(); }; class Teacher { public: Teacher(); }; class Aspirant : public Student, public Teacher { public: Aspirant(): Teacher(), Student() {} }; 25. 09. 2020 ВГУЭС 20
Множественное наследование Student * s; class Student { public: S=new Student(); virtual void print() {} S->print(); // student: : print() s=new Aspirant(); }; class Teacher { S->print(); // Aspirant: : print public: Teacher(); }; class Aspirant : public Student, public Teacher { public: Aspirant(): Teacher(), Student() {} void print () {} }; 25. 09. 2020 ВГУЭС 21
Множественное наследованиеконфликт имен 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(); } }; 25. 09. 2020 ВГУЭС 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() {} }; 25. 09. 2020 ВГУЭС Student * s; S=new Student(); S->print(); // student: : print() s=new Aspirant(); S->print(); // error – какой print()? ((Teacher *)s)->print(); //OK 23
Множественное наследованиеконфликт имен 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. 09. 2020 ВГУЭС 24
Множественное наследованиевиртуальные базовые классы 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) {} }; 25. 09. 2020 ВГУЭС Class Man { string fio; public: Man() {} Man (string s): fio(s) {} }; 25
- Slides: 27