Bài giảng lập trình hướng đối tượng kế thừa trần phước tuấn

19 185 0
Bài giảng lập trình hướng đối tượng kế thừa   trần phước tuấn

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Tài li u c Eckel, Bruce Thinking in C++, 2nd Ed Vol L P TRÌNH NG IT NG K TH A Chapter 14: Inheritance & Composition Skip p 612 (Operator Overloading & Inheritance) to p 614 (Incremental Development) Dietel C++ How to Program, 4th Ed Chapter 7: Object-Oriented Programming: Inheritance Tr n Ph c Tu n tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com TPT - LTH T 9/6/2009 M N i dung u Thu t ng a quan h th a k quan h i t ng Object relationship diagram Cây th a k inheritance hierarchy Ví d MotorVehicle nh ngh a l p MotorVehicle nh ngh a l p 9/6/2009 TPT - LTH T Quy n truy nh p Access privilege Ki u th a k Cái gì? Các i t ng c th a C++ Upcast Slice Downcast a th a k Multiple Inheritance u th a m t c m c a ngôn ng dùng bi u di n m i quan h c bi t gi a l p Các l p c tr u t ng hóa t ch c thành t s phân c p l p th a m t m c cao h n c a tr u t ng hóa, cung c p m t c ch gom chung l p có liên quan v i thành m t m c khái quát hóa c tr ng cho toàn b l p nói Các l p v i c m t ng t có th c t ch c thành m t s phân c p k th a p tr u t ng hóa c a toàn b l p bên d i 9/6/2009 TPT - LTH T M u Quan h “là 1”: th a bi u di n quan h “là 1” cs M ng thông d ng nh t th a th t sinh viên m t ng i t hình tròn m t hình ellipse t tam giác m t a giác t xe ca “là” xe ng c t xe t i “là” xe ng c t xe máy “là” xe ng c th a t o kh ng xây d ng l p m i t p ã có, ó hàm thành ph n c th a h ng t p cha Trong C++, k th a nh ngh a s ng thích, nh ó ta có ch chuy n ki u t ng th a v a có kh ng t o c ch khái quát hoá v a có kh ng chuyên bi t hoá th a cho phép t ch c l p chia s mã ch ng trình chung nh y có th dàng s a ch a, nâng c p h th ng TPT - LTH T 9/6/2009 M Th a k cho phép ta nh ngh a l p m i, g i l p (subclass) hay l p d n xu t (derived class) t t l p ã có, g i l p cha (superclass) hay l p c s (base class) p d n xu t s th a k thành ph n (d li u, hàm) c a l p c s , ng th i thêm vào thành ph n m i, bao hàm c vi c làm “t t n” ho c làm l i nh ng công vi c mà l p s ch a làm t t ho c không phù h p v i p d n xu t 9/6/2009 TPT - LTH T ng c dùng theo hai cách ph n ánh m i quan h gi a l p Là công c ch c phân c p l p d a vào s chuyên bi t hóa, ó m t vài hàm thành ph n c a l p phiên b n hoàn thi n ho c c bi t hoá c a phiên b n p cha Trong C++ m i quan h th ng c cài t s ng: th a public Hàm thành ph n ph ng th c o ph n ánh s chia s mã ch ng trình gi a l p quan h t ng ngh a nh ng có th có t ch c d li u mã ch ng trình t ng t Trong C++, ch chia s mã th ng c cài t dùng: th a private Hàm thành ph n không ph ng th c o u Th a k cho phép nhi u l p xu t t l p c s Th a k ng cho phép m t l n xu t c a nhi u l p c s Th a k không ch gi i h n p d n xu t có th l p c p d n xu t khác 9/6/2009 TPT - LTH T 9/6/2009 M u u TPT - LTH T có th n p có th m c: M t s cho quan h Thu t ng p cha – superclass (ho c l p c it ng - base class) p t ng quát h n m t quan h “là” i t ng thu c l p cha có t p thu c tính hành vi S Tên class p – subclass (ho c l p d n xu t – derived class) p c th i t th a k n m t quan h “là” ng thu c l p có t p thu c tính hành vi S (do p cha), kèm thêm t p thu c tính hành vi S’ c a riêng l p (Các) ph Quan “là” g i s th a k - Inheritance (ch I tam giác h ng i t ng “P.I.E” (Polymorphism – Inheritance – Encapsulations)) Ta nói r ng l p “th a k ” l p cha, ho c l p cd n xu t t ” l p cha quan h it ORD Thu c tí tính/P ng th c public # Thu c tí tính/P ng th c protected - Thu c tí tính/P ng th c private quan h ng - name - address - studentID - nextAvailID : int Private +publicOp() # protectedOp() - privateOp() it Student Class - privateAttribute # protectedAttribute 10 TPT - LTH T 9/6/2009 ng + ng th c Object Relationship Diagram TPT - LTH T 9/6/2009 (Các) thu c tính Tên class Protected + addSchedule(theSchedule : Schedule, forSemester : Semester) + getSchedule(forSemester : Semester) : Schedule + hasPrerequisites(forCourseOffering : CourseOffering) : boolean # passed(theCourseOffering : CourseOffering) : boolean + getNextAvailID() : int Public 9/6/2009 TPT - LTH T 11 9/6/2009 TPT - LTH T 12 CHinhVe quan h Ví d ng Bình th ng: Class bì bình th ng In nghiêng: nghiêng: Class thu n o G ch d i: Object (không ph i class) Tên class (Cá (Các) thu c tí tính (Cá (Các) ph it ng th c Bình th ng: Thu c tí tính bì bình th In nghiêng: nghiêng: không s d ng G ch d i: Thu c tí tính static Bình th ng: P In nghiêng: nghiêng: P G ch d i: P ng ng th c bì bình th ng th c virtual ng th c static quan h i + float + float + void + DienTich() ChuVi() Ve() ng CTuGiac # CDiem P1 # CDiem P2 # CDiem P3 + CTamGiac() + float DienTich() + float ChuVi() + void Ve() + # CDiem # CDiem # CDiem # CDiem # CDiem # float # float i ng MOTOR VEHICLE CAR Có th bi u di n quan h i nhi u l p theo m t hai ki u sau: MOTOR VEHICLE MOTOR VEHICLE - passengers TRUCK - maximum payload CAR + load() + unload() 9/6/2009 TPT - LTH T + CEllipse() + float DienTich() + float ChuVi() + void Ve() + 14 Bi u di n m t quan h th a k gi a hai l p b ng m t m i tên tr p n l p cha - make - model + drive() CAR Tam A B TPT - LTH T quan h Ta ã làm quen v i quan h th a k , xem ta có th bi u di n s quan h i t ng nh th Khi mô t quan h th a k gi a l p ORD, ích ch rõ s khác bi t gi a l p MOTOR VEHICLE tham gia quan h ó - vin CEllipse P1 P2 P3 P4 + CTuGiac() + float DienTich() + float ChuVi() + void Ve() + 9/6/2009 ng t l p khác l p cha a ch nào? l p khác ch nào? MaLoaiHinhVe CTamGiac 13 TPT - LTH T 9/6/2009 # int 15 9/6/2009 TRUCK CAR TPT - LTH T TRUCK 16 quan h i ng quan h Bi u di n thu c tính hành vi Gi p MotorVehicle có thu c tính vin (s ng ký xe), make (hãng), model (ki u), hành vi drive (lái) Ta có s : p l p Gi , xe ca có thêm thu c tính passengers (s hành khách t a mà xe có th ch ); xe t i có thêm thu c tính maximum payload (tr ng t i t i a) hành vi load (b c), unload (d ) vin make model drive() Khi bi u di n thu c tính hành vi a l p con, ch kê thu c tính/hành vi mà l p cha MOTOR VEHICLE + n li t n gi n hoá s , không l p l i thu c tính/hành vi c th a k (có th tìm th y chúng b ng cách “l n theo m i tên”) nh n m nh m khác bi t, cho phép d dàng nh n lý cho vi c l p l p i xe t i, xe ca u có thu c tính vin, make, model, hành vi drive vin make model drive() CAR ng Bi u di n s khác bi t gi a l p nh th nào? u khác ch ng có lý MOTOR VEHICLE + i TRUCK 17 TPT - LTH T 9/6/2009 18 TPT - LTH T 9/6/2009 MOTOR VEHICLE quan h i Cây th a k ng CAR Ta có s : PICKUP TRUCK i xe ca u có thu c tính vin, make, model, hành vi drive, kèm theo thu c tính passengers MOTOR VEHICLE + CAR - passengers vin make model drive() TRUCK - maximum payload + load() + unload() 9/6/2009 TRUCK TPT - LTH T i xe t u có thu c tính vin, make, model, hành vi drive, kèm theo thu c tính maximum payload hành vi load, unload 19 DUMP TRUCK Các quan h th a k c bi u di n i l p t d i l p cha nh n m nh b n ch t ph a quan h Ta ng có th có nhi u t ng th a k , i m i t ng, l p ti p c th a k p cha t xe ch rác (dump truck) xe t i, c ng xe ch y b ng Ngh a l p c th a k thu c tính hành vi il pc bên ng c a t xe ch rác có m i thu c tính hành vi a xe ng c , kèm theo i thu c tính hành vi a xe t i, kèm theo thu c tính hành vi a riêng xe rác 9/6/2009 TPT - LTH T 20 Ví d MotorVehicle Nh i ví d Ví d MotorVehicle th a k u b ng MotorVehicle nh ngh a l p c , NH NGH A L P C S MOTOR VEHICLE + vin make model drive() CAR - passengers class MotorVehicle { public: MotorVehicle(int vin, string make, string model); ~MotorVehicle(); void drive(int speed, int distance); private: int vin; string make; string model; }; TRUCK - maximum payload MOTOR VEHICLE * + vin make model drive() + load() + unload() 9/6/2009 21 TPT - LTH T Ví d MotorVehicle NH NGH A L P C S Ti p theo, nh ngh a constructor, destructor, hàm drive() ây, ta ch nh ngh a t m drive()) 9/6/2009 22 TPT - LTH T Ví d MotorVehicle NH NGH A L P CON Mô t t l p ng gi ng nh bi u di n ORD, ta ch p trung vào nh ng m khác v i l p cha Ích l i n gi n hoá khai báo l p, tr nguyên lý óng gói c a h ng i t ng tr tái s ng code (s ng l nh ngh a c a thành viên d li u ph ng th c) vi c che d u thông tin ng có th có vai trò vi c t o th a k MotorVehicle::MotorVehicle(int vin, string make, string model) { this->vin = vin; this->make = make; this->model = model; } MotorVehicle::~MotorVehicle() {} // We could actually use // the default destructor void MotorVehicle::drive(int speed, int distance) { cout make = make; this->model = model; this->passengers = passengers; } Car::~Car() {} 9/6/2009 TPT - LTH T 27 9/6/2009 TPT - LTH T 28 NH NGH A L P CON Ví d MotorVehicle Nh Ví d MotorVehicle m ng constructor a l p c , ta dùng danh sách kh i t o a constructor (t ng t nh kh i t o h ng thành viên) tr c ti p truy nh p thành viên d li u c a l p c thi u tính óng gói : ph i bi t sâu v chi ti t l p c sâu không tái s ng mã kh i t o c a l p c không th kh i t o thành viên private a l p c quy n truy nh p y, ta s ng constructor al pc cách nh ph i can thi p Ta o ph n thu c v th hi n c a l p cha it TPT - LTH T Ví d MotorVehicle Car::Car(int vin, string make, string model, int passengers) : MotorVehicle(vin, make, model) { this->passengers = passengers; } c, sau ó "g n" thêm 29 NH NGH A L P CON m b o r ng m t th hi n c a l p c c o tr c, u ta b qua i g i constructor p c i danh sách kh i t o c a l p d n xu t, trình biên d ch s ng chèn thêm l i g i constructor nh c a l p Tuy ta c n g i constructor a l p c t cách ng minh, i destructor a l p d n xu t, i g i ng t cho destructor a l p c không c n thi t vi c 9/6/2009 c th c hi n t ng TPT - LTH T c nh t ng i constructor a MotorVehicle i tham s vin, make, model Ta không c n kh i t o thành viên vin, make, model bên constructor a Car a 9/6/2009 o tr nh ngh a constructor nh sau: Nguyên t c: i t ng thu c l p bao g m m p cha ng thêm tính n ng b sung a l p t th hi n c a l p c c t o tr tính n ng b sung a l p d n xu t NH NGH A L P CON 31 9/6/2009 TPT - LTH T Ví d MotorVehicle 30 NH NGH A L P CON Khi t o th hi n c a m t l p n xu t, constructor cg ib ut pc nh t chuy n d n v phía p d n xu t Khi hu th hi n c a l p d n xu t, destructor c g i u t p d n xu t, lên n qua l p c (th ng c l i) 9/6/2009 TPT - LTH T 32 Ví d MotorVehicle ng t , khai báo NH NGH A L P CON nh ngh a c a l p Truck nh sau: class Truck : public MotorVehicle { public: Truck (int vin, string make, string model, int maxPayload); ~Truck(); void Load(); void Unload(); Truck::Truck(int vin, string make, private: string model, int maxPayload) int maxPayload; :MotorVehicle(vin, make, model) }; { this->maxPayload = maxPayload; } Quy n truy nh p (Access privilege) Ta ã s ng hai ki u quy n truy nh p cho thành viên d li u ph ng th c public - thành viên/ph ng th c có th c truy nh p t i t ng C++ thu c ph m vi private - thành viên/ph ng th c ch có th c truy nh p t bên l ó class Car : public MotorVehicle { public: Car ( ); ~Car(); private: int passengers; }; Còn có ki u quy n truy nh p th ba: protected Truck::~Truck() {} void Truck::Load() {…} void Truck::Unload() {…} 33 TPT - LTH T 9/6/2009 Quy n truy nh p Quay i th a k l p c i MotorVehicle class MotorVehicle { private: int vin; string make; string model; }; i thành viên d li c khai báo private, ó chúng ch có th c truy nh p t th hi n c a MotorVehicle t c l p d n xu t quy n truy nh p thành viên private a MotorVehicle y, n mã sau s có l i p Truck quy n truy nh p thành viên private make al pc MotorVehicle 9/6/2009 Quy n truy nh p Tuy quy nh quy n truy nh p nh có v nh ng m b o tính óng gói u không, ta có th c a m t l p ch c, c quy n truy nh p vào c u trúc bên ng cách t o m t l p d n xu t c a l ó Tr ng h p n u ta xây d ng l p c c ý mu n “c p” cho l p d n xu t quy n truy nh p t i m t s thành viên/ph ng th c, khoá protected quy nh quy n truy nh p cho thành viên/ph ng th c s cs ng b i l p d n xu t void Truck::Load() { if (this->make == “Ford”) { } } TPT - LTH T 34 TPT - LTH T 9/6/2009 35 9/6/2009 TPT - LTH T 36 Quy n truy nh p Quy n truy nh p khoá protected dùng p quy n truy nh p t i thành viên/ph ng th c c a m t l p cho l p d n xu t (và ch l p d n xu t) a l ó iv im i t ng khác c a C++, thành viên/ph ng th c protected c coi nh private (chúng u không th truy nh c) Tuy tiêu chí óng gói khuyên nên i th private, nh ng t o th a k , ng i ta th ng hay p quy n truy nh p protected Gi ta mu n l p a MotorVehicle có th truy nh p d li u c a Thay t khoá private ng protected, class MotorVehicle { ta có khai báo: protected: int vin; string make; string model; }; y, n mã sau s l i Tuy nhiên truy nh p t bên ns m p Truck ã có quy n truy nh p thành viên protected make al pc MotorVehicle 9/6/2009 37 TPT - LTH T Quy n truy nh p 9/6/2009 void Truck::Load() { if (this->make == “Ford”) { } } 38 TPT - LTH T Quy n truy nh p Các quy n truy nh p có vai trò quan h th a k ? Các quy n truy nh p có vai trò quan h th a k ? Bây gi , ta chuy n sang cách s ng khoá quy n truy nh p khai báo ch ki u th a k Bây gi , ta chuy n sang cách s ng t khoá quy n truy nh p khai báo l ch ki u th a k class Car : public MotorVehicle { class Car : public MotorVehicle }; { class Car : protected MotorVehicle class Car : private MotorVehicle 9/6/2009 TPT - LTH T 39 9/6/2009 TPT - LTH T { { }; }; }; 40 Ki u th a k khoá ng quy c dùng Ki u th a k ch rõ “ki u” th a k class Car : public MotorVehicle cs nh nh ng có th "nhìn th y" quan h th a k ó Nh c l i: p Car th a k p MotorVehicle có ngh a i t ng Car ng có thành viên d li u ph ng th c c a MotorVehicle “nhìn th y” quan h th a k gi a Car MotorVehicle ngh a có th truy nh p t i thành viên mà Car c th a k MotorVehicle có th truy nh p m i thành viên/ph ng th c public a l p cha c th a k gi nguyên quy n truy 42 TPT - LTH T 9/6/2009 a Ki u th a k class Car : private MotorVehicle Th a k private: ch có th hi th a k p cha { }; class Car : protected MotorVehicle ó bi t c i t ng bên không th truy nh p thành viên c th a k Nói cách khác, i thành viên thành private l p c th a k u tr Có th dùng th a k private o l p có m i ch c n ng/d ch v a l p cha nh ng l i không cho bên bi t v ch c n ng ó 9/6/2009 }; thành viên public a cha ng c coi nh public a thành viên protected a cha ng c coi nh protected Ki u th a k Th a k public (lo i thông d ng nh t): quan h th a k c nhìn th y t in i i t ng C++ t ng tác v i m t th hi n c a l p u có th coi nh t th hi n c a l p cha nói cách khác, thành viên nh p 41 TPT - LTH T 9/6/2009 { TPT - LTH T 43 { }; Khi dùng ki u th a k protected, l c th a , ch có l p a l ó nhìn th y quan h th a k quan h “Car th a k MotorVehicle” s c nhìn th y bên Car l p a Car nói cách khác, thành viên c th a k truy nh p b xu ng protected 9/6/2009 TPT - LTH T có quy n 44 T NG H P Ki u th a k K th a public Các thành ph n public protected a l p c s thành ph n public protected a l p d n xu t private protected public Không th truy c p s K th a private Các thành ph n public protected a l p c thành ph n private a l p d n xu t Hình th c k th a private K th a protected Các thành ph n public protected a l p c thành ph n protected a l p d n xu t Thành ph n trong pc s s protected private protected protected public private protected public 9/6/2009 TPT - LTH T 45 9/6/2009 TPT - LTH T 46 9/6/2009 TPT - LTH T 47 9/6/2009 TPT - LTH T 48 Cái gì? Cái gì? Khi làm quen v i th a k , ta th ng nh n khái ni m r ng m t th hi n c a l p d n xu t có th i x nh th m t th hi n c a pc ví d , ta có th coi m t th hi n c a Car nh m t th hi n c a MotorVehicle 9/6/2009 ng Car u MotorVehicle ng Truck u MotorVehicle c l i không úng (v ng MotorVehicle ng MotorVehicle TRUCK - maximum payload + load() + unload() ng quát) u Car u Truck TPT - LTH T 9/6/2009 50 Cái gì? ng ó th hi n r t rõ ràng cách ta ngh a m t l p Nh y, t th hi n c a Car có quy n truy nh p thu c tính hành vi sau: nh t l p th a k có m i thu c tính hành vi p cha, ng thêm thu c tính hành vi a riêng l p ó thành viên d li u: vin, make, model, passengers ph ng th c: drive() a Ng c l i, lý m t th hi n c a l p cha i có quy n truy nh p t i thu c tính/hành vi ch nh ngh a l p t th hi n c a m t l p MotorVehicle không th truy nh p passengers ng t , l p anh-ch -em không th truy nh p thu c tính/hành vi a i thu c tính hành vi (không ph i private) a l p cha, thành viên nh ngh a riêng cho l p ó it ng nh C++ 9/6/2009 vin make model drive() Ví d , m t s tr ng h p, ta có th ch o xe ch y b ng máy xe ca Nh ng th a k a ta, òi h i ng m i xe ch y b ng máy u xe ca Cái gì? Theo ngôn ng a C++: có th truy nh p t i: it it it it 49 TPT - LTH T + Ta ã nói r ng t ng c a th a k khai báo l p có m i CAR thu c tính hành vi a l p cha - passengers Ngh a là, tuyên b sau úng Nh ng tuyên b ng Nh y xác ngh a gì? Trong C++, ta làm vi ó nh th nào? MOTOR VEHICLE TPT - LTH T 51 9/6/2009 ng Car không th có ph ng th c Load() UnLoad(), i t ng Truck không th có passengers m b o yêu c ó nh th nào? TPT - LTH T 52 Các i ng c th a k C++ Trong th a k MotorVehicle, gi c khai báo protected, ta s public pc ng c th a k C++ Ta có th khai báo th hi n c a l ng chúng nh th nào? Thí d , khai báo tr i3 ó s p: Các i mvPointer->Drive(); cPointer->Drive(); tPointer->Drive(); khai báo TPT - LTH T ng 54 c th a k C++ Thí d : it ng thu c l p // Method defined by this class // Method defined by base class // Method defined by base class Tuy nhiên, ph ng th nh ngh a t i m t l p d n xu t ch có th c truy nh p b i l ó xét ph ng th c Load() a l p Truck mvPointer = new MotorVehicle(10, “Honda”, “S2000”); cPointer = new Car(10, “Honda”, “S2000”, 2); tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); 9/6/2009 TPT - LTH T 9/6/2009 Trong c ba tr ng h p, ta có th truy nh p ph ng th c c a l p cha, ta ã s ng ki u th a k public MotorVehicle* mvPointer; Car* cPointer; Truck* tPointer; ng tr ng ng c th a k C++ class Truck : public MotorVehicle { public: Truck(int vin, string make, string model, int maxPayload); ~Truck(); void Load(); void Unload(); protected: int maxPayload; }; 53 TPT - LTH T i ng class Car : public MotorVehicle { public: Car(int vin, string make, string model, int passengers); ~Car(); protected: int passengers; }; class MotorVehicle { public: MotorVehicle(int vin, string make, string model); ~MotorVehicle(); void Drive(int speed, int distance); protected: int vin; string make; string model; }; Các i Các l p d n xu t Car Truck: i thành viên d li u ng ki u th a k MotorVehicle: 9/6/2009 Các mvPointer->Load(); cPointer->Load(); tPointer->Load(); 55 9/6/2009 // Error // Error // Method defined by this class TPT - LTH T 56 Upcast Upcast Các th hi n c a l p th a k public có th th hi n c a l p cha ph i x nh th th hi n c a l p con, ta có quy n truy nh p thành viên ng th c public mà ta có th truy nh p t t th hi n c a l p cha l u ý ta th c hi n t t c l nh gán ó mà không c n i ki u t ng minh i l p a MotorVehicle u ch c ch n có m i thành viên ph ng th c có m t MotorVehicle, vi c t ng tác i th hi n c a l p nh th chúng MotorVehicle chút r i ro Ví d , nh sau ây h p l , t k mvPointer2 ang tr im t MotorVehicle, t Car, hay t Truck Do ó, C++ cho phép dùng tr c khai báo thu c lo i tr il pc ch i th hi n c a l p d n xu t ta có th th c hi n l nh sau: MotorVehicle* mvPointer2; mvPointer2->Drive(); mvPointer2 = mvPointer; // Point to another MotorVehicle mvPointer2 = cPointer; mvPointer2 = tPointer; // Point to a Car // Point to a Truck TPT - LTH T 9/6/2009 57 Upcast upcast Upcast th ng g p t i nh ngh a hàm, m t tr /tham chi nl pc c yêu c u, nh ng tr /tham chi n l p d n xu t c ng c ch p nh n xét hàm sau i v i tr MotorVehicle* mvPointer2 = cPointer; ví d upcast 58 Upcast Upcast trình t ng tác v i th hi n c a l p d n xu t nh th th hi n c a l p c th , ây vi i m t tr (ho c tham chi u) i l p d n xu t thành m t m t tr (ho c tham chi u) i l p c ta ã th y ví d TPT - LTH T 9/6/2009 void sellMyVehicle(MotorVehicle& myVehicle) { } i v i tham chi u có th i sellMyVehicle t cách h p l i tham s m t tham chi u t i m t MotorVehicle, t Car, ho c m t Truck // Refer to the instance pointed to by cPointer MotorVehicle& mvReference = *cPointer; // Refer to an automatically-allocated instance c Car c(10, “Honda”, “S2000”, 2); MotorVehicle& mvReference2 = c; 9/6/2009 TPT - LTH T 59 9/6/2009 TPT - LTH T 60 Upcast Upcast u ta dùng m t tr il pc tr i m t th hi n c a l p d n xu t, trình biên d ch s ch cho ta coi i t ng nh th thu c l p c Nh Chú ý ng g n m t tr /tham chi u l p c i m t th hi n c a l p d n xu t, ta không h thay i b n ch t c i t ng c tr i Ví d , y, ta không th làm nh sau không làm m t th hi n c a Truck suy gi m thành m t MotorVehicle, ch cho ta m t cách nhìn khác i v i t ng Truck t ng tác i t ng ó Do y, ta v n có th truy nh p t i thành viên ph ng th c c a p d n xu t c sau gán tr pc i nó: MotorVehicle* mvPointer2 = tPointer; // Point to a Truck mvPointer2->Load(); // Error ó trình biên d ch không th m b o r ng tr th c ang tr i m t th hi n c a Truck TPT - LTH T 9/6/2009 61 mvPointer2 = tPointer; // Point to a Truck tPointer->Load(); // We can still this mvPointer2->Load(); // Even though we can’t this (error) 62 TPT - LTH T 9/6/2009 Slicing Slicing ôi ta mu nh MotorVehicle* mvPointer2 = tPointer; // Point to a Truck i h n ki u Ví d Ví d , ta mu n t o m t th hi n c a MotorVehicle d a m t th hi n c a Car (s ng copy constructor cho MotorVehicle) Car c(10, “Honda”, “S2000”, 2)’ MotorVehicle mv(c); Slicing trình chuy n m t th hi n c a l p d n xu t thành m t th hi n c a l p c p l m t th hi n c a l p d n xu t có t t c thành viên ph ng th c c a l p c a ây, t th hi n c a MotorVehicle c t o b i copy constructor ch gi i nh ng thành viên c a Car mà có MotorVehicle (Car instance) Quy trình g i “slicing” th c ch t ta c t b t (slice off) nh ng thành viên d li u ph ng th nh ngh a l p d n xu t (MotorVehicle instance) c mv vin make model passengers vin make model sliced off 9/6/2009 TPT - LTH T 63 9/6/2009 TPT - LTH T 64 Slicing Downcast Th c ra, quy trình c ng gi ng h t nh ta ng i gi a ki u d li u có s n b t t d li u (ch ng h n i m t s ch m ng sang nguyên) Slicing x y ta dùng phép gán Car c(10, “Honda”, “S2000”, 2)’ MotorVehicle mv = c; 65 TPT - LTH T 9/6/2009 Downcast Upcast i tr /tham chi u t i l p n xu t thành tr /tham chi u t i l p Downcast quy trình ng c l i: i ki u tr /tham chi u t i l p c thành tr /tham chi u t i l p d n xu t downcast quy trình r c r i h n có nhi m không an toàn Downcast Tr c h t, downcast không ph i m t quy trình t òi h i ki u t ng minh (explicit type cast) ó h p lý ng - u ta bi t ch c ch n r ng m t tr pc i m t l p con, ta có th i ki u cho tr cách s ng static_cast nh i r ng: không ph i “m i xe ch y b ng máy u xe t i” ó, c r i s y sinh n u trình biên d ch cho ta i m t tr t i MotorVehicle thành m t tr i Truck, th c tr ang tr im i t ng Car Ví d , n mã sau s gây l i biên d ch: MotorVehicle* mvPointer3; … Car* cPointer2 = mvPointer3; Truck* tPointer2 = mvPointer3; MotorCycle mcPointer2 = mvPointer3; 9/6/2009 66 TPT - LTH T 9/6/2009 TPT - LTH T qu th pc ang tr ng Car* cPointer = new Car(10, “Honda”, “S2000”, 2); MotorVehicle* mv = cPointer; // Upcast Car* cPointer2; cPointer2 = static_cast(mv); // Explicit downcast Ta có th th y m i nguy hi m làm vi c - chuy n x y i t ng ta ang c i ki u th c không thu c l p mà ta ngh ? Truck* tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); // Error // Error // Error MotorVehicle* mv = tPointer; // Upcast Car* cPointer2; cPointer = static_cast(mv); // Explicit downcast 67 9/6/2009 TPT - LTH T 68 a th a k - Multiple Inheritance Downcast Truck* tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); MotorVehicle* mv = tPointer; // Upcast Car* cPointer2; cPointer = static_cast(mv); // Explicit downcast n mã hoàn toàn h p l s c trình biên ch ch p nh n Tuy nhiên, u ch n trình trên, ch ng trình có th (th ng l u truy nh n thành viên/ph ng th nh ngh a c a l p d n xu t mà ta i t i) 69 TPT - LTH T 9/6/2009 a th a k STUDENT * student ID - name - GPA Xét m t h th ng qu n lý nhân viên EMPLOYEE * employee ID - name - office number ng th c Foo() Do tính ph c t p ti m tàng c a th a k , t s ngôn ng p trình (ch ng h n Java, C#) không cài t tính ng 70 TPT - LTH T 9/6/2009 a th a k STUDENT * student ID - name - GPA EMPLOYEE * employee ID - name - office number STUDENT-EMPLOYEE - tuition credit i h c l u tr thông tin sinh viên Ta có th th y trùng l p ti m tàng thành viên d li u, ch ng h n l p Student-Employee th a k thành viên name hai l p c C++, có th gi i quy t r c r i trùng tên b ng toán t ph m vi (cho trình biên d ch bi t ta ang nói n name nào) i lúc v a sinh viên v a nhân viên TPT - LTH T hai l p có ph - tuition credit có th sinh viên-nhân viên có thêm thu c tính n 9/6/2009 ch ng h n n u th a k STUDENT-EMPLOYEE sinh viên có th có thu c tính ch ng h n tên, mã sinh viên, m trung bình nhân viên có th có thu c tính tên, mã nhân viên, phòng làm vi c Có th có nh ng ng a th a k d ng th a k ph c t p cho phép ta t o l p d n xu t th a k thu c tính hành vi nhi u h n m t l p c Nên h n ch ng a th a k có th n lo i nh m l n tên trùng c phí (tuition credit) 71 9/6/2009 TPT - LTH T 72 a th a k - cài a th a k Ví d a th a k th a k Nguyên lý th a k n không i: p th a i thu c tính hành vi a l p cha PERSON - name - address - phone number STUDENT * student ID - GPA Trong C++, ó có ngh a l p d n xu t th a i thành viên d li u ph ng th c c a t ng pc 9/6/2009 TPT - LTH T t Khai báo m t l p d n xu t c a nhi u l p c : class StudentEmployee : public Student, public Employee { }; nh ngh a l p d n xu t, constructor : StudentEmployee::StudentEmployee EMPLOYEE i constructor a l p ( ) : Student( ), Employee( ) { }; * employee ID - office number Khi g p mù m tên (ch ng h n phiên b n name th a k pc ví d tr c) ta có th ng toán t ph m vi STUDENT-EMPLOYEE this->Student::name // Refers to the version of name // inherited from Student this->Employee::name // Refers to this version of name // inherited from Employee - tuition credit 73 9/6/2009 TPT - LTH T 74 9/6/2009 TPT - LTH T 76 a th a k Trong th c t , có m t lo t v ti m tàng liên quan a th a k , ph n l n c r i mù m Có th ta không bao gi n dùng a th a , nh ng c ng có nh ng tình hu ng mà a th a k l i gi i t t nh t (và có th nh t) us ng a th a k , nh t thi t ph i cân nh c v xung t có th y sinh ng l p có liên quan 9/6/2009 TPT - LTH T 75 [...]... h p l và s c trình biên ch ch p nh n Tuy nhiên, u ch n trình trên, ch ng trình có th (th ng là khi l u truy nh n thành viên/ph ng th nh ngh a c a l p d n xu t mà ta i t i) 69 TPT - LTH T 9/6/2009 a th a k STUDENT * student ID - name - GPA Xét m t h th ng qu n lý nhân viên EMPLOYEE * employee ID - name - office number ng th c Foo() Do tính ph c t p ti m tàng c a th a k , t s ngôn ng p trình (ch ng h... n xu t downcast là quy trình r c r i h n và có nhi m không an toàn Downcast Tr c h t, downcast không ph i là m t quy trình t òi h i ki u t ng minh (explicit type cast) ó là h p lý ng - nó luôn u ta bi t ch c ch n r ng m t con tr pc i m t l p con, ta có th i ki u cho con tr cách s ng static_cast nh i r ng: không ph i “m i xe ch y b ng máy u là xe t i” do ó, c r i s y sinh n u trình biên d ch cho ta... “Honda”, “S2000”, 2)’ MotorVehicle mv(c); Slicing là quá trình chuy n m t th hi n c a l p d n xu t thành m t th hi n c a l p c p l vì m t th hi n c a l p d n xu t có t t c các thành viên và ph ng th c c a l p c a nó ây, t th hi n c a MotorVehicle c t o b i copy constructor ch gi i nh ng thành viên c a Car mà có trong MotorVehicle (Car instance) Quy trình này g i là “slicing” vì th c ch t ta c t b t (slice... Slicing Downcast Th c ra, quy trình này c ng gi ng h t nh khi ta ng i gi a các ki u d li u có s n và b t t d li u (ch ng h n khi i m t s ch m ng sang nguyên) Slicing còn x y ra khi ta dùng phép gán Car c(10, “Honda”, “S2000”, 2)’ MotorVehicle mv = c; 65 TPT - LTH T 9/6/2009 Downcast Upcast là i con tr /tham chi u t i l p n xu t thành con tr /tham chi u t i l p Downcast là quy trình ng c l i: i ki u con... automatically-allocated instance c Car c(10, “Honda”, “S2000”, 2); MotorVehicle& mvReference2 = c; 9/6/2009 TPT - LTH T 59 9/6/2009 TPT - LTH T 60 Upcast Upcast u ta dùng m t con tr il pc tr i m t th hi n c a l p d n xu t, trình biên d ch s ch cho ta coi i t ng nh th nó thu c l p c Nh Chú ý ng khi g n m t con tr /tham chi u l p c i m t th hi n c a l p d n xu t, ta không h thay i b n ch t c i t ng c tr i Ví d , y, ta không... ta v n có th truy nh p t i các thành viên và ph ng th c c a p d n xu t ngay c sau khi gán con tr pc i nó: MotorVehicle* mvPointer2 = tPointer; // Point to a Truck mvPointer2->Load(); // Error ó là vì trình biên d ch không th m b o r ng con tr th c ra ang tr i m t th hi n c a Truck TPT - LTH T 9/6/2009 61 mvPointer2 = tPointer; // Point to a Truck tPointer->Load(); // We can still do this mvPointer2->Load();... hàm, khi m t con tr /tham chi nl pc c yêu c u, nh ng con tr /tham chi n l p d n xu t c ng c ch p nh n xét hàm sau i v i con tr MotorVehicle* mvPointer2 = cPointer; ví d upcast 58 Upcast Upcast là quá trình t ng tác v i th hi n c a l p d n xu t nh th nó là th hi n c a l p c th , ây là vi i m t con tr (ho c tham chi u) i l p d n xu t thành m t m t con tr (ho c tham chi u) i l p c ta ã th y ví d TPT... th y các trùng l p ti m tàng trong các thành viên d li u, ch ng h n l p Student-Employee th a k thành viên name hai l p c trong C++, có th gi i quy t r c r i do trùng tên này b ng toán t ph m vi (cho trình biên d ch bi t ta ang nói n name nào) i cùng lúc v a là sinh viên v a là nhân viên TPT - LTH T hai l p cùng có ph - tuition credit có th sinh viên-nhân viên có thêm thu c tính n 9/6/2009 ch ng h ... th c protected - Thu c tí tính/P ng th c private quan h ng - name - address - studentID - nextAvailID : int Private +publicOp() # protectedOp() - privateOp() it Student Class - privateAttribute... Java, C#) không cài t tính ng 70 TPT - LTH T 9/6/2009 a th a k STUDENT * student ID - name - GPA EMPLOYEE * employee ID - name - office number STUDENT-EMPLOYEE - tuition credit i h c l u tr thông... model, int passengers) { this->vin = vin; this->make = make; this->model = model; this->passengers = passengers; } Car::~Car() {} 9/6/2009 TPT - LTH T 27 9/6/2009 TPT - LTH T 28 NH NGH A L P CON

Ngày đăng: 03/01/2016, 10:22

Tài liệu cùng người dùng

Tài liệu liên quan