Bài giảng Lập trình hướng đối tượng: Virtual method và Polymorphism - Trần Phước Tuấn
lượt xem 2
download
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
Bình luận(0) Đăng nhập để gửi bình luận!
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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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.
- 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
- 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
- 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
- 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Lập trình hướng đối tượng: Chương 2 - Nguyễn Sơn Hoàng Quốc, ThS. Nguyễn Tấn Trần Minh Khang
14 p | 174 | 12
-
Bài giảng Lập trình hướng đối tượng - Chương 3: Kế thừa
18 p | 135 | 10
-
Bài giảng Lập trình hướng đối tượng: Chương 9 - ĐH Bách Khoa TP.HCM
14 p | 88 | 10
-
Bài giảng Lập trình hướng đối tượng - Chương 1: Phương pháp lập trình hướng đối tượng
9 p | 141 | 9
-
Bài giảng Lập trình hướng đối tượng: Chương 3 - ĐH Bách Khoa TP.HCM
12 p | 109 | 8
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - Trần Thị Anh Thi
7 p | 197 | 7
-
Bài giảng Lập trình hướng đối tượng (Dùng C#): Chương 5 - Trần Minh Thái
12 p | 59 | 6
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 8
5 p | 67 | 5
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 2
10 p | 54 | 5
-
Bài giảng Lập trình hướng đối tượng 1: Chương 3 - ThS. Thái Kim Phụng
13 p | 66 | 5
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 0
2 p | 84 | 4
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 1
15 p | 105 | 4
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 5
5 p | 88 | 4
-
Bài giảng Lập trình hướng đối tượng: Nhập môn - Trần Phước Tuấn
15 p | 141 | 4
-
Bài giảng Lập trình hướng đối tượng: Chương 0 - Châu Thị Bảo Hà
6 p | 97 | 3
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 4
4 p | 69 | 3
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - ĐH Bách Khoa Hà Nội
16 p | 33 | 3
-
Bài giảng Lập trình hướng đối tượng: Chương 6 - Đa hình
15 p | 5 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn