intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Lập trình hướng đối tượng: Virtual method và Polymorphism - Trần Phước Tuấn

Chia sẻ: Năm Tháng Tĩnh Lặng | Ngày: | Loại File: PDF | Số trang:12

47
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng Lập trình hướng đối tượng: Virtual method và Polymorphism trình bày các nội dung chính như: Nối kết tĩnh (Static binding), nối kết động (Dynamic binding), chạy chương trình, bài toán thực tế, phương thức ảo,...và một số nội dung khác

Chủ đề:
Lưu

Nội dung Text: Bài giảng Lập trình hướng đối tượng: Virtual method và Polymorphism - Trần Phước Tuấn

  1. N i dung L P TRÌNH 1. i k t t nh (Static binding) NG IT NG 2. i k t ng (Dynamic binding) 3. Ch y ch ng trình VIRTUAL METHOD 4. Bài toán th c t & POLYMORPHISM 5. Ph ng th c o, a hình Tr n Ph c Tu n tuantp@hcmup.edu.vn 6. Ph ng th c h y b o http://giaotrinh.tranphuoctuan.com 7. Ph ng th c thu n o, l p tr u t ng 9/6/2009 TPTU N - LTH T 2 1. Static binding 2. Dynamic binding class Circle class Circle { int x,y,r; { int x,y,r; public: public: Circle (int xx, int yy, int rr) Circle (int xx, int yy, int rr) { x=xx; y=yy; r=rr; { x=xx; y=yy; r=rr; } } void print() void print() { cout
  2. 3. Ch y ch ng trình 3. Ch y ch ng trình Polymorphism ability occurs only when you use a pointer to an object and used-methods of classes are virtual methods virtual ReturnType Perhaps, you want or ReturnType virtual to see “Son” are accepted on the screen. 9/6/2009 TPTU N - LTH T 5 9/6/2009 TPTU N - LTH T 6 4. Bài toán th c t 4. Bài toán th c t Gi ta c n qu n lý m t danh sách các i t ng có ki u có th khác nhau, ta c n gi i quy t hai v n Nguoi Cách l u tr Thao tác x lý Xét tr ng h p c th , các it ng là Ng i Sinh viên CongNhan SinhVien Công nhân 9/6/2009 TPTU N - LTH T 7 9/6/2009 TPTU N - LTH T 8
  3. class Nguoi { class SinhVien : public Nguoi protected: { protected: char *HoTen; char *MaSo; int NamSinh; public: public: SinhVien(char *n, char *ms, int ns) : Nguoi(char *ht, int ns):NamSinh(ns) Nguoi(n,ns) { MaSo = strdup(ms);} {HoTen = strdup(ht);} ~SinhVien() {delete [] MaSo;} ~Nguoi() {delete [] HoTen;} void Xuat() const void Xuat() const { { cout
  4. void main() t qu xu t ra màn hình c a ch ng trình { Nguoi *a[N]; Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982 a[0] = new SinhVien("Vien Van Sinh", ”200001234", 1982); Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984 a[1] = new SinhVien("Le Thi Ha Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984 Dong",”200001235", 1984); Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960 a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); tc i it ng u c quan m nh a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); ng i vì thao tác c th c hi n thông qua con XuatDs(4,a); tr n l p Ng i. } 9/6/2009 TPTU N - LTH T 13 9/6/2009 TPTU N - LTH T 14 5. Ph ng th c o, a hình 5. Ph ng th c o, a hình Con tr thu c l p c s có th tr n l p con: Ph ng th c o cho phép gi i quy t v n Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982); . Ta qui nh m t hàm thành ph n là Ta mong mu n thông qua con tr thu c l p c s ph ng th c o b ng cách thêm t khoá có th truy xu t hàm thành ph n c nh ngh a i p con: virtual vào tr c khai báo hàm. pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien, Trong ví d trên, ta thêm t khoá virtual // thuc te: goi Xuat cua lop Nguoi vào tr c khai báo c a hàm xuat. 9/6/2009 TPTU N - LTH T 15 9/6/2009 TPTU N - LTH T 16
  5. class Nguoi class SinhVien : public Nguoi { { protected: protected: char *HoTen; char *MaSo; int NamSinh; public: public: SinhVien(char *n, char *ms, int ns) : Nguoi(char *ht, int ns):NamSinh(ns) Nguoi(n,ns) { MaSo = strdup(ms);} {HoTen = strdup(ht);} ~SinhVien() {delete [] MaSo;} ~Nguoi() {delete [] HoTen;} virtual void Xuat() const virtual void Xuat() const { { cout
  6. 5. Ph ng th c o, a hình 5. Ph ng th c o, a hình const int N = 4; Nguoi *pn; void main() pn = new SinhVien("Vien Van Sinh“,"200001234“,1982); { pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien Nguoi *a[N]; Con tr pn thu c l p Nguoi nh ng tr n i a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982); a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984); ng sinh viên, vì v y pn->Xuat() th c hi n a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); thao tác xu t c a l p sinh viên. a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a); } Tr i ví d trên, khi i a[i] l n l t tr n các Ph ng th c o xuat c khai báo p Nguoi cho phép s i t ng thu c các lo i khác nhau, thao tác ng con tr n l p c s (Nguoi) nh ng tr nm t i ng thu c l p con (Sinh viên, công nhân) g i úng thao tác ng ng v i l p s c g i. p con: 9/6/2009 TPTU N - LTH T 21 9/6/2009 TPTU N - LTH T 22 5. Ph ng th c o, a hình 5. Ph ng th c o, a hình Dùng ph ng th c o, ta d dàng nâng c p s a ch a. void XuatDs(int n, Nguoi *an[]) Vi c thêm m t lo i i t ng m i r t n gi n, ta không c n { ph i s a i thao tác x lý (hàm XuatDs). Qui trình thêm ch for (int i = 0; i < n; i++) là xây d ng l p con k th a t p c s ho c các l p con ã { có và nh ngh a l i ph ng th c ( o) pm it on uc n an[i]->Xuat(); cout
  7. 5. Ph ng th c o, a hình 5. Ph ng th c o, a hình L uý ch th c hi n c a ph ng th c o Ph ng th c o ch ho t ng thông qua con tr . Khi g i m t thao tác, kh ng ch n úng phiên b n Mu n m t hàm tr thành ph ng th c o có hai cách: tu theo i t ng th c hi n thông qua con tr Khai báo v i t khoá virtual n l p c s c g i là tính a hình Hàm t ng ng pc s ã là ph ng th c o. (polymorphisms). Ph ng th c o ch ho t ng n u các hàm pc ch a hình c th c hi n nh i i t ng và l p con có nghi th c giao ti p gi ng h t nhau. có thêm m t b ng ph ng th c o. B ng này ch a u p con nh ngh a l i ph ng th c o thì s a ch a các ph ng th c o và nó c trình biên i ph ng th c p c s (g n nh t có nh ch kh i t o m t cách ng m nh khi thi t l p i ngh a). ng. 9/6/2009 TPTU N - LTH T 25 9/6/2009 TPTU N - LTH T 26 5. Ph ng th c o, a hình ch th c hi n ph ng th c o Khi thao tác c th c hi n thông qua con tr , hàm có a ch trong b ng ph ng th c o s c g i. Trong ví d trên, m i i t ng thu c l p c s Ng i có b ng ph ng th c o có m t ph n t là a ch hàm Nguoi::Xuat. M i i t ng thu c l p SinhVien có b ng t ng t nh ng n i dung là a ch a hàm SinhVien::Xuat. 9/6/2009 TPTU N - LTH T 27 9/6/2009 TPTU N - LTH T 28
  8. NGUOI 6. Ph ng th c hu b o vtptr Trong ví d qu n lý danh sách các i t ng thu c các l p Name Nguoi, SinhVien, CongNhan, … Thao tác d n d p i t ng là Xuat(); n thi t. Id const int N = 4; STUDENT void main() { vtptr Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh", "20001234“,1982); Name a[1] = new NuSinh("Le Thi Ha Dong", "20001235“,1984); a[2] = new CongNhan("Tran Nan Cong", 1000000, 1984); Id Xuat(); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a); maso for (int i = 0; i < 4; i++) delete a[i]; 9/6/2009 TPTU N - LTH T 29 } 9/6/2009 TPTU N - LTH T 30 6. Ph ng th c hu b o class Nguoi { protected: Thông qua con tr thu c l p c s Nguoi, char *HoTen; ch có ph ng th c hu a l p Nguoi int NamSinh; c g i. public: Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} virtual ~Nguoi() {delete [] HoTen;} o m vi c d n d p là y , ta virtual void Xuat(ostream &os) const { os dùng ph ng th c hu o.
  9. 7. Ph ng th c thu n o, l p tr u t ng 7. Ph ng th c thu n o, l p tr u t ng Result of so-high generation L p tr u t ng có ít nh t m t ph ng th c thu n o class Shape Ph ng th c thu n o là ph ng th c Pure virtual methods void print() double area() How will we implement these methods? không có ph n thân (ph n nh ngh a) double perimeter() Cú pháp c a ph ng th c thu n o: virtual DataType Method (…) = 0; Ta không th o m t i t ng c a l p tr u class Circle class Rectangle class Triangle int x,y,r; int x1,y1,x2,y2; int x1,y1,x2,y2,x3,y3; ng, nh ng có th khai báo con tr a l p void print() void print() void print() tr u t ng. double area() double area() double area() double perimeter() double perimeter() double perimeter() Con tr này ph i c tr n m t i t ng a m t l p c th . 9/6/2009 TPTU N - LTH T 33 9/6/2009 TPTU N - LTH T 34 7. Ph ng th c thu n o, l p tr u t ng 7. Ph ng th c thu n o, l p tr u t ng Trong ví d trên, các hàm thành ph n trong l p p c s tr u t ng là l p c s không có i Shape là ph ng th c o thu n tuý. Nó b o m ng nào thu c chính nó. M t i t ng thu c l p không th o c i t ng thu c l p Shape. Ví s tr u t ng ph i thu c m t trong các l p con. trên c ng nh ngh a n i dung cho ph ng th c Xét các l p Circle, Rectangle, Square k th a t o thu n tuý, nh ng ch có các i t ng thu c l p p Shape con có th i. Trong ví d trên, các hàm trong l p Shape có n i Ph ng th c o thu n tuý có ý ngh a cho vi c t dung nh ng n i dung không có ý ngh a. ng th i ch c s phân c p các l p, nó óng vai trò ch a ta luôn luôn có th o c i t ng thu c l p n ch tr ng cho các l p con n vào v i phiên n phù h p. Shape, i u này không úng v i t t ng c a ph ng pháp lu n h ng i t ng. n thân các l p con c a l p c s tr u t ng ng có th là l p c s tr u t ng 9/6/2009 TPTU N - LTH T 35 9/6/2009 TPTU N - LTH T 36
  10. Abstract class…. Abstract subclass • A is an abstract class • B is public subclass of A • In B, the inherited method MA() is not overriden yet B is abstract class Error: Cannot create instance of abstract class ‘B’ 9/6/2009 TPTU N - LTH T 37 9/6/2009 TPTU N - LTH T 38 Abstract subclass… Demonstration The following program depicts using abstract class. People generate all concrete classes as Circle, Rectangle,… into Shape class. Subclass of a concrete class User will input some shape details may be an abstract class. Program will print out details of all shape Values of area and perimeter of each Error: Cannot create instance shape will be printed also. of abstract class ‘B’ 9/6/2009 TPTU N - LTH T 39 9/6/2009 TPTU N - LTH T 40
  11. Class Shape and Circle Class Rectangle 9/6/2009 TPTU N - LTH T 41 9/6/2009 TPTU N - LTH T 42 Class ShapeList…, main(), Result Class ShapeList 9/6/2009 TPTU N - LTH T 43 9/6/2009 TPTU N - LTH T 44
  12. Summary Summary Virtual Method is a way to make polymorphism. Syntax for virtual method: Abstract class is a result of so-high virtual ReturnType Method (parameters) generation. ReturnType virtual Method (parameters) Compiler will determine the right method will be Abstract class must have at least one pure called using a virtual function table for every virtual method. class which contains virtual methods. Pure virtual method is a virtual method but it has You can not create an object of abstract no code. class but you can declare a pointer to it Syntax for pure virtual method: then, it points to an object of a concrete virtual ReturnType Method (parameters)=0; subclass. 9/6/2009 TPTU N - LTH T 45 9/6/2009 TPTU N - LTH T 46 Exercises Using the class Object, implement classes: Father, Mother, Son, Daughter. Write a program will Input a list of members in a family. Store them into a Vector object. Print out members of the family. 9/6/2009 TPTU N - LTH T 47 9/6/2009 TPTU N - LTH T 48
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2