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: Kế thừa - Trần Phước Tuấn

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

82
lượt xem
7
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: Kế thừa trình bày các nội dung chính: Thuật ngữ của quan hệ kế thừa, sơ đồ quan hệ đối tượng, cây kế thừa, quyền truy nhập, kiểu kế thừa,... Mời các bạn cùng tham khảo để nắm bắt các nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Lập trình hướng đối tượng: Kế thừa - Trần Phước Tuấn

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

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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