Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
574,22 KB
Nội dung
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