TTààii lili(cid:1227)(cid:1227)uu (cid:255)(cid:255)(cid:1233)(cid:1233)cc

(cid:132) Eckel, Bruce. Thinking in C++, 2nd Ed. Vol 1.

(cid:133) Chapter 14: Inheritance & Composition

(cid:132) Skip p. 612 (Operator Overloading & Inheritance) to p. 614

(Incremental Development)

(cid:132) Dietel. C++ How to Program, 4th Ed.

P TRÌNH LL(cid:1200)(cid:1200)P TRÌNH (cid:43)(cid:1132)(cid:43)(cid:1132)(cid:1246)(cid:1246)NG (cid:264)NG (cid:264)(cid:1236)(cid:1236)I T(cid:1132)I T(cid:1132)(cid:1254)(cid:1254)NGNG KK(cid:1218)(cid:1218) THTH(cid:1262)(cid:1262)AA

(cid:133) Chapter 7: Object-Oriented Programming: Inheritance

Tr(cid:1195)n Ph(cid:1133)(cid:1247)c Tu(cid:1193)n tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com

TPT - LTH(cid:264)T 2 9/6/2009

1. M1. M(cid:1251)(cid:1251) (cid:255)(cid:255)(cid:1195)(cid:1195)uu

i dung NN(cid:1245)(cid:1245)i dung

(cid:132) Quy(cid:1221)n truy nh(cid:1201)p Access privilege

(cid:132) (cid:48)(cid:1251) (cid:255)(cid:1195)u (cid:132) Thu(cid:1201)t ng(cid:1267) (cid:70)(cid:1259)a quan h(cid:1227)

th(cid:1263)a k(cid:1219)

(cid:132) (cid:54)(cid:1269) (cid:78)(cid:1219) th(cid:1263)a là m(cid:1245)t (cid:255)(cid:1211)c (cid:255)(cid:76)(cid:1223)m c(cid:1259)a ngôn ng(cid:1267) dùng (cid:255)(cid:1223) bi(cid:1223)u di(cid:1225)n m(cid:1237)i quan h(cid:1227) (cid:255)(cid:1211)c bi(cid:1227)t gi(cid:1267)a các l(cid:1247)p. Các l(cid:1247)p (cid:255)(cid:1133)(cid:1255)c tr(cid:1263)u t(cid:1133)(cid:1255)ng hóa và t(cid:1241) ch(cid:1261)c thành (cid:80)(cid:1245)t s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p l(cid:1247)p.

(cid:132) (cid:54)(cid:1131)(cid:3)(cid:255)(cid:1239) quan h(cid:1227) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng

Object relationship diagram

(cid:132) Ki(cid:1223)u th(cid:1263)a k(cid:1219) (cid:132) Cái gì là cái gì? (cid:132) Các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a

(cid:132) Cây th(cid:1263)a k(cid:1219)

(cid:78)(cid:1219) trong C++

inheritance hierarchy

(cid:132) (cid:54)(cid:1269) (cid:78)(cid:1219) th(cid:1263)a là m(cid:1245)t m(cid:1261)c cao h(cid:1131)n c(cid:1259)a tr(cid:1263)u t(cid:1133)(cid:1255)ng hóa, cung c(cid:1193)p m(cid:1245)t c(cid:1131) ch(cid:1219) gom chung các l(cid:1247)p có liên quan v(cid:1247)i nhau thành m(cid:1245)t m(cid:1261)c khái quát hóa (cid:255)(cid:1211)c tr(cid:1133)ng cho toàn b(cid:1245) các l(cid:1247)p nói trên.

(cid:132) Ví d(cid:1257) MotorVehicle

(cid:133) (cid:264)(cid:1231)nh ngh(cid:429)a l(cid:1247)p MotorVehicle (cid:133) (cid:264)(cid:1231)nh ngh(cid:429)a các l(cid:1247)p con

(cid:132) Upcast (cid:132) Slice (cid:132) Downcast (cid:132) (cid:264)a th(cid:1263)a k(cid:1219)

Multiple Inheritance

(cid:132) Các l(cid:1247)p v(cid:1247)i các (cid:255)(cid:1211)c (cid:255)(cid:76)(cid:1223)m t(cid:1133)(cid:1131)ng t(cid:1269) nhau có th(cid:1223) (cid:255)(cid:1133)(cid:1255)c t(cid:1241) ch(cid:1261)c thành m(cid:1245)t s(cid:1131) (cid:255)(cid:1239) phân c(cid:1193)p k(cid:1219) th(cid:1263)a. (cid:47)(cid:1247)p (cid:1251) trên cùng là tr(cid:1263)u t(cid:1133)(cid:1255)ng hóa c(cid:1259)a toàn b(cid:1245) các l(cid:1247)p (cid:1235) bên d(cid:1133)(cid:1247)i nó.

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 3 4 9/6/2009 9/6/2009

1. M1. M(cid:1251)(cid:1251) (cid:255)(cid:255)(cid:1195)(cid:1195)uu

1. M1. M(cid:1251)(cid:1251) (cid:255)(cid:255)(cid:1195)(cid:1195)uu (cid:132) Quan h(cid:863) “là 1”: (cid:46)(cid:1219) th(cid:1263)a (cid:255)(cid:1133)(cid:1255)c s(cid:1265) (cid:71)(cid:1257)ng thông d(cid:1257)ng nh(cid:1193)t (cid:255)(cid:1223)

(cid:132) (cid:46)(cid:1219) th(cid:1263)a th(cid:1133)(cid:1249)ng (cid:255)(cid:1133)(cid:1255)c dùng theo hai cách

bi(cid:1223)u di(cid:1225)n quan h(cid:1227) “là 1”. (cid:133) (cid:48)(cid:1245)t sinh viên là m(cid:1245)t ng(cid:1133)(cid:1249)i (cid:133) (cid:48)(cid:1245)t hình tròn là m(cid:1245)t hình ellipse (cid:133) (cid:48)(cid:1245)t tam giác là m(cid:1245)t (cid:255)a giác (cid:133) (cid:48)(cid:1245)t cái xe ca “là” xe (cid:255)(cid:1245)ng c(cid:1131) (cid:133) (cid:48)(cid:1245)t cái xe t(cid:1191)i “là” xe (cid:255)(cid:1245)ng c(cid:1131) (cid:133) (cid:48)(cid:1245)t cái xe máy “là” xe (cid:255)(cid:1245)ng c(cid:1131)

(cid:133) (cid:264)(cid:1223) ph(cid:1191)n ánh m(cid:1237)i quan h(cid:1227) gi(cid:1267)a các l(cid:1247)p. Là công c(cid:1257) (cid:255)(cid:1223) (cid:87)(cid:1241) ch(cid:1261)c và phân c(cid:1193)p l(cid:1247)p d(cid:1269)a vào s(cid:1269) chuyên bi(cid:1227)t hóa, trong (cid:255)ó m(cid:1245)t vài hàm thành ph(cid:1195)n c(cid:1259)a l(cid:1247)p con là phiên b(cid:1191)n hoàn thi(cid:1227)n ho(cid:1211)c (cid:255)(cid:1211)c bi(cid:1227)t hoá c(cid:1259)a phiên b(cid:1191)n (cid:1251) (cid:79)(cid:1247)p cha. Trong C++ m(cid:1237)i quan h(cid:1227) này th(cid:1133)(cid:1249)ng (cid:255)(cid:1133)(cid:1255)c cài (cid:255)(cid:1211)t s(cid:1265) (cid:71)(cid:1257)ng:

(cid:132) (cid:46)(cid:1219) th(cid:1263)a public. (cid:132) Hàm thành ph(cid:1195)n là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o

(cid:132) (cid:46)(cid:1219) th(cid:1263)a t(cid:1189)o kh(cid:1191) (cid:81)(cid:259)ng xây d(cid:1269)ng l(cid:1247)p m(cid:1247)i t(cid:1263) (cid:79)(cid:1247)p (cid:255)ã có, trong (cid:255)ó hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a h(cid:1133)(cid:1251)ng t(cid:1263) (cid:79)(cid:1247)p cha. Trong C++, k(cid:1219) th(cid:1263)a còn (cid:255)(cid:1231)nh ngh(cid:429)a s(cid:1269) (cid:87)(cid:1133)(cid:1131)ng thích, nh(cid:1249) (cid:255)ó ta có (cid:70)(cid:1131) ch(cid:1219) chuy(cid:1223)n ki(cid:1223)u t(cid:1269) (cid:255)(cid:1245)ng.

(cid:132) (cid:46)(cid:1219) th(cid:1263)a v(cid:1263)a có kh(cid:1191) (cid:81)(cid:259)ng t(cid:1189)o c(cid:1131) ch(cid:1219) khái quát hoá v(cid:1263)a có

kh(cid:1191) (cid:81)(cid:259)ng chuyên bi(cid:1227)t hoá.

(cid:133) (cid:264)(cid:1223) ph(cid:1191)n ánh s(cid:1269) chia s(cid:1215) mã ch(cid:1133)(cid:1131)ng trình gi(cid:1267)a các l(cid:1247)p không có quan h(cid:1227) (cid:89)(cid:1221) (cid:80)(cid:1211)t ng(cid:1267) ngh(cid:429)a nh(cid:1133)ng có th(cid:1223) có t(cid:1241) ch(cid:1261)c d(cid:1267) li(cid:1227)u và mã ch(cid:1133)(cid:1131)ng trình t(cid:1133)(cid:1131)ng t(cid:1269) nhau. Trong C++, (cid:70)(cid:1131) ch(cid:1219) chia s(cid:1215) mã này th(cid:1133)(cid:1249)ng (cid:255)(cid:1133)(cid:1255)c cài (cid:255)(cid:1211)t dùng:

(cid:132) (cid:46)(cid:1219) th(cid:1263)a cho phép t(cid:1241) ch(cid:1261)c các l(cid:1247)p chia s(cid:1215) mã ch(cid:1133)(cid:1131)ng trình chung nh(cid:1249) (cid:89)(cid:1201)y có th(cid:1223) (cid:71)(cid:1225) dàng s(cid:1265)a ch(cid:1267)a, nâng c(cid:1193)p h(cid:1227) th(cid:1237)ng.

(cid:132) (cid:46)(cid:1219) th(cid:1263)a private. (cid:132) Hàm thành ph(cid:1195)n không là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 6 5 9/6/2009 9/6/2009

1. M1. M(cid:1251)(cid:1251) (cid:255)(cid:255)(cid:1195)(cid:1195)uu

1. M1. M(cid:1251)(cid:1251) (cid:255)(cid:255)(cid:1195)(cid:1195)uu

(cid:132) Th(cid:1263)a k(cid:1219) cho phép nhi(cid:1221)u l(cid:1247)p có th(cid:1223) (cid:71)(cid:1199)n

xu(cid:1193)t t(cid:1263) 1 l(cid:1247)p c(cid:1131) s(cid:1251)

(cid:132) Th(cid:1263)a k(cid:1219) (cid:70)(cid:458)ng cho phép m(cid:1245)t l(cid:1247)p có th(cid:1223) là

(cid:132) Th(cid:1263)a k(cid:1219) cho phép ta (cid:255)(cid:1231)nh ngh(cid:429)a 1 l(cid:1247)p m(cid:1247)i, g(cid:1233)i là l(cid:1247)p con (subclass) hay l(cid:1247)p d(cid:1199)n xu(cid:1193)t (derived class) t(cid:1263) (cid:80)(cid:1245)t l(cid:1247)p (cid:255)ã có, g(cid:1233)i là l(cid:1247)p cha (superclass) hay l(cid:1247)p c(cid:1131) s(cid:1251) (base class).

(cid:71)(cid:1199)n xu(cid:1193)t c(cid:1259)a nhi(cid:1221)u l(cid:1247)p c(cid:1131) s(cid:1251)

(cid:132) Th(cid:1263)a k(cid:1219) không ch(cid:1229) gi(cid:1247)i h(cid:1189)n (cid:1251) 1 m(cid:1261)c: M(cid:1245)t (cid:79)(cid:1247)p d(cid:1199)n xu(cid:1193)t có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) cho các (cid:79)(cid:1247)p d(cid:1199)n xu(cid:1193)t khác

(cid:132) (cid:47)(cid:883)p d(cid:835)n xu(cid:829)t s(cid:853) th(cid:899)a k(cid:855) các thành ph(cid:831)n (d(cid:903) li(cid:863)u, hàm) c(cid:895)a l(cid:883)p c(cid:767) s(cid:887), (cid:255)(cid:875)ng th(cid:885)i thêm vào các thành ph(cid:831)n m(cid:883)i, bao hàm c(cid:827) vi(cid:863)c làm “t(cid:873)t (cid:75)(cid:767)n” ho(cid:847)c làm l(cid:825)i nh(cid:903)ng công vi(cid:863)c mà trong l(cid:883)p (cid:70)(cid:767) s(cid:887) ch(cid:769)a làm t(cid:873)t ho(cid:847)c không còn phù h(cid:891)p v(cid:883)i (cid:79)(cid:883)p d(cid:835)n xu(cid:829)t

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 7 8 9/6/2009 9/6/2009

(cid:54)(cid:1131)(cid:3)(cid:255)(cid:54)(cid:1131)(cid:3)(cid:255)(cid:1239)(cid:1239) quan h

quan h(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)i t(cid:1133)i t(cid:1133)(cid:1255)(cid:1255)ngng

ThuThu(cid:1201)(cid:1201)tt ngng(cid:1267)(cid:1267)

(cid:132) (cid:47)(cid:1247)p cha – superclass (ho(cid:1211)c l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) - base class)

(cid:133) (cid:79)(cid:1247)p t(cid:1241)ng quát h(cid:1131)n trong m(cid:1245)t quan h(cid:1227) “là” (cid:133) các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p cha có cùng t(cid:1201)p thu(cid:1245)c tính và hành vi S

Tên class

(cid:132) (cid:47)(cid:1247)p con – subclass (ho(cid:1211)c l(cid:1247)p d(cid:1199)n xu(cid:1193)t – derived class)

(Các) thu(cid:1245)c tính

Tên class

(cid:133) (cid:79)(cid:1247)p c(cid:1257) th(cid:1223) (cid:75)(cid:1131)n trong m(cid:1245)t quan h(cid:1227) “là” (cid:133) các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con có cùng t(cid:1201)p thu(cid:1245)c tính và hành vi S (do

(Các) ph(cid:1133)(cid:1131)ng th(cid:1261)c

th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) (cid:79)(cid:1247)p cha), kèm thêm t(cid:1201)p thu(cid:1245)c tính và hành vi S’ c(cid:1259)a riêng l(cid:1247)p con

(cid:132) Quan (cid:75)(cid:1227) “là” còn g(cid:1233)i là s(cid:1269) th(cid:1263)a k(cid:1219) - Inheritance (ch(cid:1267) I trong tam giác h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng “P.I.E” (Polymorphism – Inheritance – Encapsulations))

(cid:132) Ta nói r(cid:1205)ng l(cid:1247)p con “th(cid:1263)a k(cid:1219) (cid:87)(cid:1263)” l(cid:1247)p cha, ho(cid:1211)c l(cid:1247)p con (cid:179)(cid:255)(cid:1133)(cid:1255)c d(cid:1199)n

Object Relationship Diagram Object Relationship Diagram ORDORD

xu(cid:1193)t t(cid:1263)” l(cid:1247)p cha

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 10 9 9/6/2009 9/6/2009

(cid:54)(cid:1131)(cid:3)(cid:255)(cid:54)(cid:1131)(cid:3)(cid:255)(cid:1239)(cid:1239) quan h

quan h(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)i t(cid:1133)i t(cid:1133)(cid:1255)(cid:1255)ngng

(cid:54)(cid:1131)(cid:3)(cid:255)(cid:54)(cid:1131)(cid:3)(cid:255)(cid:1239)(cid:1239) quan h ++

quan h(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)i t(cid:1133)i t(cid:1133)(cid:1255)(cid:1255)ngng (cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc public public

ThuThu(cid:1245)(cid:1245)c tc tíính/Pnh/P(cid:75)(cid:1133)(cid:1131)ng th

##

ThuThu(cid:1245)(cid:1245)c tc tíính/Pnh/P(cid:75)(cid:1133)(cid:1131)ng th

protected (cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc protected

Student Student

--

ThuThu(cid:1245)(cid:1245)c tc tíính/Pnh/P(cid:75)(cid:1133)(cid:1131)ng th

private (cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc private

ClassClass

name -- name address -- address studentID -- studentID nextAvailID : int -- nextAvailID : int

-- privateAttribute privateAttribute # protectedAttribute # protectedAttribute

Private Private

Protected Protected

+publicOp() +publicOp() # protectedOp() # protectedOp() privateOp() -- privateOp()

+ addSchedule(theSchedule : Schedule, forSemester : Semester) + addSchedule(theSchedule : Schedule, forSemester : Semester) + getSchedule(forSemester : Semester) : Schedule + getSchedule(forSemester : Semester) : Schedule + hasPrerequisites(forCourseOffering : CourseOffering) : boolean + hasPrerequisites(forCourseOffering : CourseOffering) : boolean # passed(theCourseOffering : CourseOffering) : boolean # passed(theCourseOffering : CourseOffering) : boolean getNextAvailID() : int ++ getNextAvailID() : int

Public Public

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 11 12 9/6/2009 9/6/2009

CHinhVe

# int MaLoaiHinhVe

VVíí dd(cid:1257)(cid:1257)

(cid:54)(cid:1131)(cid:3)(cid:255)(cid:54)(cid:1131)(cid:3)(cid:255)(cid:1239)(cid:1239) quan h

quan h(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)i t(cid:1133)i t(cid:1133)(cid:1255)(cid:1255)ngng

+ float DienTich() + float ChuVi() + void Ve() + ...

nh th(cid:1133)(cid:1249)(cid:1249)ngng

BBìình th(cid:1133) nh th(cid:1133)(cid:1249)(cid:1249)ng: Class b In nghiêng: Class thu In nghiêng GG(cid:1189)(cid:1189)ch d(cid:1133)

ng: Class bìình th(cid:1133) : Class thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)oo i class) : Object (không ph(cid:1191)(cid:1191)i class)

ch d(cid:1133)(cid:1247)(cid:1247)ii: Object (không ph

Tên class Tên class

nh th(cid:1133)(cid:1249)(cid:1249)ngng

CTamGiac

CTuGiac

CEllipse

(C(Cáác) thu

c) thu(cid:1245)(cid:1245)c tc tíínhnh

BBìình th(cid:1133) nh th(cid:1133)(cid:1249)(cid:1249)ng: Thu In nghiêng: không s In nghiêng ch d(cid:1133)(cid:1247)(cid:1247)ii: Thu GG(cid:1189)(cid:1189)ch d(cid:1133)

ng: Thu(cid:1245)(cid:1245)c tc tíính bnh bìình th(cid:1133) : không s(cid:1265)(cid:1265) dd(cid:1257)(cid:1257)ngng nh static : Thu(cid:1245)(cid:1245)c tc tíính static

P1 P2 P3

# CDiem # float # float

Tam A B

(C(Cáác)c) ph(cid:1133)(cid:1131)ng th

ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc

# CDiem # CDiem # CDiem # CDiem

P1 P2 P3 P4

nh th(cid:1133)(cid:1249)(cid:1249)ng: Png: P(cid:75)(cid:1133)(cid:1131)ng th

(cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c bc bìình th(cid:1133)

nh th(cid:1133)(cid:1249)(cid:1249)ngng

BBìình th(cid:1133) In nghiêng: P: P(cid:75)(cid:1133)(cid:1131)ng th In nghiêng ch d(cid:1133)(cid:1247)(cid:1247)ii: P: P(cid:75)(cid:1133)(cid:1131)ng th GG(cid:1189)(cid:1189)ch d(cid:1133)

(cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c virtual c virtual c static (cid:75)(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c static

# CDiem # CDiem # CDiem + CTamGiac() + float DienTich() + float ChuVi() + void Ve() + ...

+ CEllipse() + float DienTich() + float ChuVi() + void Ve() + ...

+ CTuGiac() + float DienTich() + float ChuVi() + void Ve() + ...

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 13 14 9/6/2009 9/6/2009

(cid:54)(cid:1131)(cid:54)(cid:1131) (cid:255)(cid:255)(cid:1239)(cid:1239) quanquan hh(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng

(cid:54)(cid:1131)(cid:54)(cid:1131) (cid:255)(cid:255)(cid:1239)(cid:1239) quanquan hh(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng

MOTOR VEHICLE

(cid:132) Ta (cid:255)ã làm quen v(cid:1247)i quan h(cid:1227) th(cid:1263)a k(cid:1219), hãy xem ta có th(cid:1223) bi(cid:1223)u di(cid:1225)n

...

nó trong s(cid:1131) (cid:255)(cid:1239) quan h(cid:1227) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng nh(cid:1133) th(cid:1219) nào

(cid:132) Bi(cid:1223)u di(cid:1225)n m(cid:1245)t quan h(cid:1227) th(cid:1263)a k(cid:1219) gi(cid:1267)a hai l(cid:1247)p b(cid:1205)ng m(cid:1245)t m(cid:458)i tên tr(cid:1235) (cid:87)(cid:1263) (cid:79)(cid:1247)p con (cid:255)(cid:1219)n l(cid:1247)p cha

CAR

...

MOTOR VEHICLE

(cid:132) Có th(cid:1223) bi(cid:1223)u di(cid:1225)n quan h(cid:1227) (cid:89)(cid:1247)i nhi(cid:1221)u l(cid:1247)p con

theo m(cid:1245)t trong hai ki(cid:1223)u sau:

- vin - make - model + drive()

(cid:132) Khi mô t(cid:1191) các quan h(cid:1227) th(cid:1263)a k(cid:1219) gi(cid:1267)a các l(cid:1247)p trong ORD, (cid:80)(cid:1257)(cid:70) (cid:255)ích là (cid:255)(cid:1223) ch(cid:1229) rõ s(cid:1269) khác bi(cid:1227)t gi(cid:1267)a các l(cid:1247)p tham gia quan h(cid:1227) (cid:255)ó (cid:133) (cid:80)(cid:1245)t l(cid:1247)p con khác l(cid:1247)p cha (cid:70)(cid:1259)a nó (cid:1251) ch(cid:1243) nào? (cid:133) các l(cid:1247)p con khác nhau (cid:1251) ch(cid:1243) nào?

MOTOR VEHICLE

...

MOTOR VEHICLE

...

CAR

TRUCK

- passengers

- maximum payload

CAR

TRUCK

CAR

TRUCK

+ load() + unload()

...

...

...

...

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 16 15 9/6/2009 9/6/2009

(cid:54)(cid:1131)(cid:54)(cid:1131) (cid:255)(cid:255)(cid:1239)(cid:1239) quanquan hh(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng

(cid:54)(cid:1131)(cid:54)(cid:1131) (cid:255)(cid:255)(cid:1239)(cid:1239) quanquan hh(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng

(cid:132) Bi(cid:1223)u di(cid:1225)n s(cid:1269) khác bi(cid:1227)t gi(cid:1267)a các l(cid:1247)p nh(cid:1133) th(cid:1219) nào?

Bi(cid:1223)u di(cid:1225)n các thu(cid:1245)c tính và hành vi

MOTOR VEHICLE

(cid:133) Gi(cid:1191) (cid:86)(cid:1265) (cid:79)(cid:1247)p MotorVehicle có các thu(cid:1245)c tính vin (s(cid:1237) (cid:255)(cid:259)ng ký xe), make (hãng), model (ki(cid:1223)u), và hành vi drive (lái)

- vin - make - model + drive()

(cid:133) (cid:81)(cid:1219)u không có gì khác nhau thì ch(cid:1207)ng có lý do gì (cid:255)(cid:1223) (cid:79)(cid:1201)p l(cid:1247)p con (cid:133) Gi(cid:1191) (cid:86)(cid:1265), xe ca có thêm thu(cid:1245)c tính passengers (s(cid:1237) hành khách t(cid:1237)(cid:76) (cid:255)a mà xe có th(cid:1223) ch(cid:1251)); xe t(cid:1191)i có thêm thu(cid:1245)c tính maximum payload (tr(cid:1233)ng t(cid:1191)i t(cid:1237)i (cid:255)a) và các hành vi load (b(cid:1237)c), unload (d(cid:1253)).

(cid:132) Khi bi(cid:1223)u di(cid:1225)n các thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a các l(cid:1247)p con, ch(cid:1229) (cid:70)(cid:1195)n li(cid:1227)t

(cid:132) Ta có s(cid:1131) (cid:255)(cid:1239):

MOTOR VEHICLE

kê các thu(cid:1245)c tính/hành vi mà l(cid:1247)p cha không có (cid:133) (cid:255)(cid:1131)n gi(cid:1191)n hoá s(cid:1131) (cid:255)(cid:1239), không l(cid:1211)p l(cid:1189)i các thu(cid:1245)c tính/hành vi (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219)

(có th(cid:1223) tìm th(cid:1193)y chúng b(cid:1205)ng cách “l(cid:1195)n theo m(cid:458)i tên”)

- vin - make - model + drive()

(cid:133) nh(cid:1193)n m(cid:1189)nh các (cid:255)(cid:76)(cid:1223)m khác bi(cid:1227)t, cho phép d(cid:1225) dàng nh(cid:1201)n ra lý do cho

vi(cid:1227)c l(cid:1201)p l(cid:1247)p con

(cid:133) (cid:80)(cid:1233)i xe t(cid:1191)i, xe ca (cid:255)(cid:1221)u có các thu(cid:1245)c tính vin, make, model, và hành vi drive

CAR

TRUCK

...

...

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 18 17 9/6/2009 9/6/2009

MOTOR VEHICLE

...

(cid:54)(cid:1131)(cid:54)(cid:1131) (cid:255)(cid:255)(cid:1239)(cid:1239) quanquan hh(cid:1227)(cid:1227) (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng

CâyCây thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

CAR

TRUCK

...

...

(cid:132) Ta có s(cid:1131) (cid:255)(cid:1239):

PICKUP TRUCK

DUMP TRUCK

...

...

(cid:132) Các quan h(cid:1227) th(cid:1263)a k(cid:1219) luôn (cid:255)(cid:1133)(cid:1255)c bi(cid:1223)u di(cid:1225)n

MOTOR VEHICLE

(cid:89)(cid:1247)i các l(cid:1247)p con (cid:255)(cid:1211)t d(cid:1133)(cid:1247)i l(cid:1247)p cha (cid:255)(cid:1223) nh(cid:1193)n m(cid:1189)nh b(cid:1191)n ch(cid:1193)t ph(cid:1191) (cid:75)(cid:1227) (cid:70)(cid:1259)a quan h(cid:1227)

(cid:133) (cid:80)(cid:1243)i xe ca (cid:255)(cid:1221)u có các thu(cid:1245)c tính vin, make, model, và hành vi drive, kèm theo thu(cid:1245)c tính passengers

(cid:132) Ta (cid:70)(cid:458)ng có th(cid:1223) có nhi(cid:1221)u t(cid:1195)ng th(cid:1263)a k(cid:1219), (cid:87)(cid:1189)i m(cid:1243)i t(cid:1195)ng, các l(cid:1247)p con ti(cid:1219)p

- vin - make - model + drive()

(cid:87)(cid:1257)c th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) (cid:79)(cid:1247)p cha (cid:133) (cid:80)(cid:1245)t xe ch(cid:1251) rác (dump truck) là xe t(cid:1191)i, và c(cid:458)ng là xe ch(cid:1189)y b(cid:1205)ng (cid:255)(cid:1245)ng c(cid:1131)

(cid:132) Ngh(cid:429)a là các l(cid:1247)p con (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) các thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a

CAR

TRUCK

- passengers

- maximum payload

(cid:133) (cid:80)(cid:1243)i xe t(cid:1191)(cid:76) (cid:255)(cid:1221)u có các thu(cid:1245)c tính vin, make, model, và hành vi drive, kèm theo thu(cid:1245)c tính maximum payload và các hành vi load, unload

+ load() + unload()

(cid:80)(cid:1233)i l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) bên trên nó (cid:133) (cid:80)(cid:1245)t xe ch(cid:1251) rác có m(cid:1233)i thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a xe (cid:255)(cid:1245)ng c(cid:1131), kèm theo (cid:80)(cid:1233)i thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a xe t(cid:1191)i, kèm theo các thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a riêng xe rác.

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 19 20 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH LL(cid:1244)(cid:1244)P C(cid:1129) S

NH NGH(cid:428)(cid:428)AA P C(cid:1129) S(cid:1248)(cid:1248)

(cid:132) Nh(cid:1247) (cid:79)(cid:1189)i ví d(cid:1257) (cid:89)(cid:1221) cây th(cid:1263)a k(cid:1219)

(cid:132) (cid:37)(cid:1203)(cid:87) (cid:255)(cid:1195)u b(cid:1205)ng (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251),

MotorVehicle

MOTOR VEHICLE

class MotorVehicle {

public:

MOTOR VEHICLE

- vin - make - model + drive()

MotorVehicle(int vin, string make, string model); ~MotorVehicle(); void drive(int speed, int distance);

private:

* vin - make - model + drive()

CAR

TRUCK

int vin; string make; string model;

};

- passengers

- maximum payload

+ load() + unload()

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 22 21 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH LL(cid:1244)(cid:1244)P C(cid:1129) S

NH NGH(cid:428)(cid:428)AA P C(cid:1129) S(cid:1248)(cid:1248)

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:132) Mô t(cid:1191) (cid:80)(cid:1245)t l(cid:1247)p con (cid:70)(cid:458)ng gi(cid:1237)ng nh(cid:1133) bi(cid:1223)u di(cid:1225)n nó trong

(cid:132) Ti(cid:1219)p theo, (cid:255)(cid:1231)nh ngh(cid:429)a constructor, destructor, và hàm drive() (cid:11)(cid:1251) (cid:255)ây, ta ch(cid:1229) (cid:255)(cid:1231)nh ngh(cid:429)a t(cid:1189)m drive())

ORD, ta ch(cid:1229) (cid:87)(cid:1201)p trung vào nh(cid:1267)ng (cid:255)(cid:76)(cid:1223)m khác v(cid:1247)i l(cid:1247)p cha

(cid:132) Ích l(cid:1255)i

MotorVehicle::MotorVehicle(int vin, string make, string model) {

(cid:133) (cid:255)(cid:1131)n gi(cid:1191)n hoá khai báo l(cid:1247)p, (cid:133) (cid:75)(cid:1243) tr(cid:1255) nguyên lý (cid:255)óng gói c(cid:1259)a h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:133) (cid:75)(cid:1243) tr(cid:1255) tái s(cid:1265) (cid:71)(cid:1257)ng code (s(cid:1265) (cid:71)(cid:1257)ng l(cid:1189)(cid:76) (cid:255)(cid:1231)nh ngh(cid:429)a c(cid:1259)a các thành

this->vin = vin; this->make = make; this->model = model;

viên d(cid:1267) li(cid:1227)u và ph(cid:1133)(cid:1131)ng th(cid:1261)c)

}

(cid:133) vi(cid:1227)c che d(cid:1193)u thông tin (cid:70)(cid:458)ng có th(cid:1223) có vai trò trong vi(cid:1227)c t(cid:1189)o cây

MotorVehicle::~MotorVehicle() {} // We could actually use

th(cid:1263)a k(cid:1219)

// the default destructor

void MotorVehicle::drive(int speed, int distance) {

cout << “Dummy drive() of MotorVehicle.” << endl;

}

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 23 24 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1203)(cid:87) (cid:255)(cid:1195)u, ta t(cid:1189)o l(cid:1247)p con Car

(cid:132) Hi(cid:1227)n gi(cid:1249) constructor (cid:70)(cid:1259)a l(cid:1247)p Car ch(cid:1229) nh(cid:1201)n 1 tham s(cid:1237)

Ch(cid:1229) rõ quan h(cid:1227) gi(cid:1267)a l(cid:1247)p con Car và l(cid:1247)p cha MotorVehicle

passengers, trong khi các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Car (cid:70)(cid:458)ng có t(cid:1193)t c(cid:1191) các thành viên (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) MotorVehicle

class Car : public MotorVehicle {

public:

Car (int passengers);

Car (int passengers); ~Car();

private:

int passengers;

};

(cid:132) (cid:264)(cid:1223) nói r(cid:1205)ng l(cid:1247)p m(cid:1247)i là l(cid:1247)p d(cid:1199)n xu(cid:1193)t c(cid:1259)a m(cid:1245)t l(cid:1247)p khác, (cid:87)(cid:1189)i dòng khai báo, ta dùng 1 (cid:71)(cid:1193)u hai ch(cid:1193)m, ti(cid:1219)p theo là t(cid:1263) khoá truy nh(cid:1201)p và tên c(cid:1259)a l(cid:1247)p cha

(cid:132) Do (cid:89)(cid:1201)y, tr(cid:1263) khi ta mu(cid:1237)n dùng giá tr(cid:1231) (cid:80)(cid:1211)(cid:70) (cid:255)(cid:1231)nh cho các thành viên (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219), ta nên truy(cid:1221)n thêm tham s(cid:1237) cho constructor (cid:255)(cid:1223) kh(cid:1251)i t(cid:1189)o vin, make, model.

class MyDerivedClass : MyBaseClass {...};

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 25 26 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:132) (cid:37)(cid:1241) sung các tham s(cid:1237) cho constructor, ta có khai báo:

(cid:132) Ti(cid:1219)p theo, (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1247)p m(cid:1247)i (cid:132) (cid:55)(cid:1237)i thi(cid:1223)u, ta s(cid:1217) (cid:255)(cid:1231)nh ngh(cid:429)a constructor và (có th(cid:1223) (cid:70)(cid:1191))

Quy (cid:1133)(cid:1247)c: (cid:255)(cid:1211)t các tham s(cid:1237) cho l(cid:1247)p cha lên (cid:255)(cid:1195)u danh sách.

class Car : public MotorVehicle {

public:

Car (int vin, string make, string model, int passengers); ~Car();

private:

destructor (cid:133) Các l(cid:1247)p con không th(cid:1263)a k(cid:1219) constructor và destructor (cid:70)(cid:1259)a l(cid:1247)p cha, do vi(cid:1227)c kh(cid:1251)i t(cid:1189)o và hu(cid:1273) các l(cid:1247)p khác nhau là khác nhau (cid:132) Phiên b(cid:1191)n constructor (cid:255)(cid:1195)u tiên mà ta có th(cid:1223) ngh(cid:429) (cid:87)(cid:1247)i:

int passengers;

};

Car::Car(int vin, string make, string model, int passengers) {

this->vin = vin; this->make = make; this->model = model; this->passengers = passengers;

}

Car::~Car() {}

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 27 28 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:132) Nh(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:76)(cid:1223)m

(cid:133) tr(cid:1269)c ti(cid:1219)p truy nh(cid:1201)p các thành viên d(cid:1267) li(cid:1227)u c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251)

(cid:132) thi(cid:1219)u tính (cid:255)óng gói : ph(cid:1191)i bi(cid:1219)t sâu v(cid:1221) chi ti(cid:1219)t l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) và ph(cid:1191)i can thi(cid:1227)p

(cid:132) (cid:264)(cid:1223) (cid:86)(cid:1265) (cid:71)(cid:1257)ng constructor (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251), ta dùng danh sách kh(cid:1251)i t(cid:1189)o (cid:70)(cid:1259)a constructor (t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133) khi kh(cid:1251)i t(cid:1189)o các h(cid:1205)ng thành viên) (cid:133) cách duy nh(cid:1193)(cid:87) (cid:255)(cid:1223) (cid:87)(cid:1189)o ph(cid:1195)n thu(cid:1245)c v(cid:1221) th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p cha (cid:87)(cid:1189)o tr(cid:1133)(cid:1247)c nh(cid:1193)t

sâu

(cid:132) Ta (cid:86)(cid:1265)(cid:68) (cid:255)(cid:1231)nh ngh(cid:429)a constructor nh(cid:1133) sau:

(cid:132) không tái s(cid:1265) (cid:71)(cid:1257)ng mã kh(cid:1251)i t(cid:1189)o c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:132) không th(cid:1223) kh(cid:1251)i t(cid:1189)o các thành viên private (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) do không có

quy(cid:1221)n truy nh(cid:1201)p

(cid:132) Nguyên t(cid:1203)c: (cid:80)(cid:1245)(cid:87) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con bao g(cid:1239)m m(cid:1245)(cid:87) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng

Car::Car(int vin, string make, string model, int passengers)

: MotorVehicle(vin, make, model)

(cid:79)(cid:1247)p cha (cid:70)(cid:1245)ng thêm các tính n(cid:259)ng b(cid:1241) sung (cid:70)(cid:1259)a l(cid:1247)p con (cid:133) (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:86)(cid:1217) (cid:255)(cid:1133)(cid:1255)c t(cid:1189)o tr(cid:1133)(cid:1247)c, sau (cid:255)ó "g(cid:1203)n" thêm các

{

tính n(cid:259)ng b(cid:1241) sung (cid:70)(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t

this->passengers = passengers;

}

(cid:132) (cid:57)(cid:1201)y, ta s(cid:1217) (cid:86)(cid:1265) (cid:71)(cid:1257)ng constructor (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251).

(cid:42)(cid:1233)i constructor (cid:70)(cid:1259)a MotorVehicle (cid:89)(cid:1247)i các tham s(cid:1237) vin, make, model

Ta không c(cid:1195)n kh(cid:1251)i t(cid:1189)o các thành viên vin, make, model (cid:87)(cid:1263) bên trong constructor (cid:70)(cid:1259)a Car (cid:81)(cid:1267)a

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 29 30 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

(cid:132) Khi t(cid:1189)o th(cid:1223) hi(cid:1227)n c(cid:1259)a m(cid:1245)t l(cid:1247)p (cid:71)(cid:1199)n xu(cid:1193)t, constructor các (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i b(cid:1203)(cid:87) (cid:255)(cid:1195)u t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) nh(cid:1193)t và chuy(cid:1223)n d(cid:1195)n v(cid:1221) phía (cid:79)(cid:1247)p d(cid:1199)n xu(cid:1193)t

(cid:132) (cid:264)(cid:1223) (cid:255)(cid:1191)m b(cid:1191)o r(cid:1205)ng m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) luôn (cid:255)(cid:1133)(cid:1255)c (cid:87)(cid:1189)o tr(cid:1133)(cid:1247)c, (cid:81)(cid:1219)u ta b(cid:1235) qua (cid:79)(cid:1249)i g(cid:1233)i constructor (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:87)(cid:1189)i danh sách kh(cid:1251)i t(cid:1189)o c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, trình biên d(cid:1231)ch s(cid:1217) (cid:87)(cid:1269) (cid:255)(cid:1245)ng chèn thêm l(cid:1249)i g(cid:1233)i constructor (cid:80)(cid:1211)(cid:70) (cid:255)(cid:1231)nh c(cid:1259)a l(cid:1247)p (cid:70)(cid:1131) (cid:86)(cid:1251)

(cid:132) Tuy ta c(cid:1195)n g(cid:1233)i constructor (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:80)(cid:1245)t cách (cid:87)(cid:1133)(cid:1249)ng minh, (cid:87)(cid:1189)i destructor (cid:70)(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, (cid:79)(cid:1249)i g(cid:1233)i (cid:87)(cid:1133)(cid:1255)ng t(cid:1269) cho destructor (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) là không c(cid:1195)n thi(cid:1219)t (cid:133) vi(cid:1227)c này (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n t(cid:1269) (cid:255)(cid:1245)ng

(cid:132) Khi hu(cid:1273) th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, các destructor (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i (cid:69)(cid:1203)(cid:87) (cid:255)(cid:1195)u t(cid:1263) (cid:79)(cid:1247)p d(cid:1199)n xu(cid:1193)t, lên (cid:71)(cid:1195)n qua các l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (th(cid:1261) (cid:87)(cid:1269) ng(cid:1133)(cid:1255)c l(cid:1189)i)

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 31 32 9/6/2009 9/6/2009

MotorVehicle VVíí dd(cid:1257)(cid:1257) MotorVehicle

(cid:264)(cid:264)(cid:1228)(cid:1228)NH NGH NH NGH(cid:428)(cid:428)AA P CON LL(cid:1244)(cid:1244)P CON

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp (Access privilege) (Access privilege)

(cid:132) (cid:55)(cid:1133)(cid:1131)ng t(cid:1269), khai báo và (cid:255)(cid:1231)nh ngh(cid:429)a c(cid:1259)a l(cid:1247)p Truck nh(cid:1133) sau:

(cid:132) Ta (cid:255)ã s(cid:1265) (cid:71)(cid:1257)ng hai ki(cid:1223)u quy(cid:1221)n truy nh(cid:1201)p cho các thành viên d(cid:1267) li(cid:1227)u

class Truck : public MotorVehicle {

public:

Truck (int vin, string make,

và ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:133) public - thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c

class Car : public MotorVehicle {

string model, int maxPayload);

public:

Car (...); ~Car();

private:

~Truck(); void Load(); void Unload();

có th(cid:1223) (cid:255)(cid:1133)(cid:1255)c truy nh(cid:1201)p t(cid:1263) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng C++ thu(cid:1245)c ph(cid:1189)m vi (cid:133) private - thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c

int passengers;

Truck::Truck(int vin, string make,

private:

};

string model, int maxPayload)

int maxPayload;

ch(cid:1229) có th(cid:1223) (cid:255)(cid:1133)(cid:1255)c truy nh(cid:1201)p t(cid:1263) bên trong chính l(cid:1247)(cid:83) (cid:255)ó

:MotorVehicle(vin, make, model)

};

{

this->maxPayload = maxPayload;

(cid:132) Còn có ki(cid:1223)u quy(cid:1221)n truy nh(cid:1201)p th(cid:1261) ba: protected

}

Truck::~Truck() {} void Truck::Load() {…} void Truck::Unload() {…}

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 33 34 9/6/2009 9/6/2009

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

class MotorVehicle {

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

... private:

(cid:132) Quay (cid:79)(cid:1189)i cây th(cid:1263)a k(cid:1219) (cid:89)(cid:1247)i MotorVehicle

(cid:132) Tuy quy (cid:255)(cid:1231)nh quy(cid:1221)n truy nh(cid:1201)p nh(cid:1133) trên có v(cid:1215) (cid:78)(cid:484) (cid:70)(cid:1257)c,

int vin; string make; string model;

};

là l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) (cid:48)(cid:1233)i thành viên d(cid:1267) li(cid:1227)(cid:88) (cid:255)(cid:1221)(cid:88) (cid:255)(cid:1133)(cid:1255)c

nh(cid:1133)ng nó (cid:255)(cid:1191)m b(cid:1191)o tính (cid:255)óng gói (cid:133) (cid:81)(cid:1219)u không, ta có th(cid:1223) (cid:79)(cid:1193)(cid:92) (cid:255)(cid:1133)(cid:1255)c quy(cid:1221)n truy nh(cid:1201)p vào c(cid:1193)u trúc bên trong c(cid:1259)a m(cid:1245)t l(cid:1247)p ch(cid:1229) (cid:69)(cid:1205)ng cách t(cid:1189)o m(cid:1245)t l(cid:1247)p d(cid:1199)n xu(cid:1193)t c(cid:1259)a l(cid:1247)(cid:83) (cid:255)ó

khai báo private, do (cid:255)ó chúng ch(cid:865) có th(cid:859) (cid:255)(cid:1133)(cid:1255)c truy nh(cid:1201)p t(cid:1263) các th(cid:1223) hi(cid:1227)n c(cid:1259)a MotorVehicle

(cid:132) Tr(cid:1133)(cid:1249)ng h(cid:1255)p n(cid:1219)u ta xây d(cid:1269)ng l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) và c(cid:1237) ý mu(cid:1237)n

(cid:133) (cid:87)(cid:1193)t c(cid:1191) các l(cid:1247)p d(cid:1199)n xu(cid:1193)t không có quy(cid:1221)n truy nh(cid:1201)p các thành viên

private (cid:70)(cid:1259)a MotorVehicle (cid:132) (cid:57)(cid:1201)y, (cid:255)(cid:82)(cid:1189)n mã sau s(cid:1217) có l(cid:1243)i

“c(cid:1193)p” cho l(cid:1247)p d(cid:1199)n xu(cid:1193)t quy(cid:1221)n truy nh(cid:1201)p t(cid:1247)i m(cid:1245)t s(cid:1237) thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c, (cid:133) (cid:87)(cid:1263) khoá protected quy (cid:255)(cid:1231)nh quy(cid:1221)n truy nh(cid:1201)p cho các thành

void Truck::Load() {

viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c s(cid:1217) (cid:255)(cid:1133)(cid:1255)c s(cid:1265) (cid:71)(cid:1257)ng b(cid:1251)i l(cid:1247)p d(cid:1199)n xu(cid:1193)t

if (this->make == “Ford”) {

...

}

}

(cid:47)(cid:1247)p Truck không có quy(cid:1221)n truy nh(cid:1201)p thành viên private make (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) MotorVehicle

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 35 36 9/6/2009 9/6/2009

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

(cid:132) Gi(cid:1191) (cid:86)(cid:1265) ta mu(cid:1237)n các l(cid:1247)p con (cid:70)(cid:1259)a MotorVehicle có th(cid:1223) truy nh(cid:1201)p d(cid:1267)

li(cid:1227)u c(cid:1259)a nó

class MotorVehicle {

(cid:132) Thay t(cid:1263) khoá private (cid:69)(cid:1205)ng protected,

(cid:132) (cid:55)(cid:1263) khoá protected dùng (cid:255)(cid:1223) (cid:70)(cid:1193)p quy(cid:1221)n truy nh(cid:1201)p t(cid:1247)i thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a m(cid:1245)t l(cid:1247)p cho các l(cid:1247)p d(cid:1199)n xu(cid:1193)t (và ch(cid:1229) các l(cid:1247)p d(cid:1199)n xu(cid:1193)t) (cid:70)(cid:1259)a l(cid:1247)(cid:83) (cid:255)ó

ta có khai báo:

... protected:

(cid:132) (cid:264)(cid:1237)i v(cid:1247)i m(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng khác c(cid:1259)a C++, các thành

int vin; string make; string model;

};

viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c protected (cid:255)(cid:1133)(cid:1255)c coi nh(cid:1133) private (chúng (cid:255)(cid:1221)u không th(cid:1223) truy nh(cid:1201)(cid:83) (cid:255)(cid:1133)(cid:1255)c)

(cid:132) Tuy tiêu chí (cid:255)óng gói khuyên nên (cid:255)(cid:1223) (cid:80)(cid:1233)i th(cid:1261) private,

void Truck::Load() {

(cid:132) (cid:57)(cid:1201)y, (cid:255)(cid:82)(cid:1189)n mã sau s(cid:1217) không có l(cid:879)i (cid:132) Tuy nhiên truy nh(cid:1201)p t(cid:1263) bên ngoài

if (this->make == “Ford”) {

(cid:89)(cid:1199)n s(cid:1217) (cid:69)(cid:1231) (cid:70)(cid:1193)m

...

nh(cid:1133)ng khi t(cid:1189)o các cây th(cid:1263)a k(cid:1219), ng(cid:1133)(cid:1249)i ta th(cid:1133)(cid:1249)ng hay (cid:70)(cid:1193)p quy(cid:1221)n truy nh(cid:1201)p protected

}

}

(cid:47)(cid:1247)p Truck (cid:255)ã có quy(cid:1221)n truy nh(cid:1201)p thành viên protected make (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) MotorVehicle

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 38 37 9/6/2009 9/6/2009

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

QuyQuy(cid:1221)(cid:1221)nn truytruy nhnh(cid:1201)(cid:1201)pp

(cid:132) Các quy(cid:1221)n truy nh(cid:1201)p có vai trò gì trong quan h(cid:1227)

(cid:132) Các quy(cid:1221)n truy nh(cid:1201)p có vai trò gì trong

th(cid:1263)a k(cid:1219)?

quan h(cid:1227) th(cid:1263)a k(cid:1219)?

(cid:132) Bây gi(cid:1249), ta chuy(cid:1223)n sang cách s(cid:1265) (cid:71)(cid:1257)ng các t(cid:1263)

khoá quy(cid:1221)n truy nh(cid:1201)p trong khai báo l(cid:1247)(cid:83) (cid:255)(cid:1223) ch(cid:1229) ki(cid:859)u th(cid:899)a k(cid:855)

(cid:132) Bây gi(cid:1249), ta chuy(cid:1223)n sang cách s(cid:1265) (cid:71)(cid:1257)ng các (cid:87)(cid:1263) khoá quy(cid:1221)n truy nh(cid:1201)p trong khai báo (cid:79)(cid:1247)(cid:83) (cid:255)(cid:1223) ch(cid:1229) ki(cid:859)u th(cid:899)a k(cid:855)

class Car : public MotorVehicle

{ ... };

class Car : public MotorVehicle

{ ... };

class Car : protected MotorVehicle

{ ... };

class Car : private MotorVehicle

{ ... };

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 39 40 9/6/2009 9/6/2009

KiKi(cid:1223)(cid:1223)uu thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

KiKi(cid:1223)(cid:1223)uu thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

class Car : public MotorVehicle

{ ... };

(cid:132) (cid:55)(cid:1263) khoá (cid:255)(cid:1133)(cid:1255)c dùng (cid:255)(cid:1223) ch(cid:1229) rõ “ki(cid:1223)u” th(cid:1263)a k(cid:1219) (cid:255)(cid:1133)(cid:1255)c s(cid:1265)

(cid:132) Th(cid:1263)a k(cid:1219) public (lo(cid:1189)i thông d(cid:1257)ng nh(cid:1193)t): quan h(cid:1227) th(cid:1263)a k(cid:1219) (cid:255)(cid:1133)(cid:1255)c nhìn

th(cid:1193)y t(cid:1263) (cid:80)(cid:1233)i n(cid:1131)i

(cid:132) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng C++ khi t(cid:1133)(cid:1131)ng tác v(cid:1247)i m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p con (cid:255)(cid:1221)u

có th(cid:1223) coi nó nh(cid:1133) (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p cha (cid:133) có th(cid:1223) truy nh(cid:1201)p m(cid:1233)i thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)c public (cid:70)(cid:1259)a l(cid:1247)p cha

(cid:132) nói cách khác, các thành viên (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) gi(cid:1267) nguyên quy(cid:1221)n truy

(cid:71)(cid:1257)ng (cid:133) nó quy (cid:255)(cid:1231)nh nh(cid:1267)ng ai có th(cid:1223) "nhìn th(cid:1193)y" quan h(cid:1227) th(cid:1263)a k(cid:1219) (cid:255)ó (cid:132) Nh(cid:1203)c l(cid:1189)i: (cid:79)(cid:1247)p Car th(cid:1263)a k(cid:1219) (cid:79)(cid:1247)p MotorVehicle có ngh(cid:429)a các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Car (cid:70)(cid:458)ng có các thành viên d(cid:1267) li(cid:1227)u và ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a MotorVehicle. (cid:133) “nhìn th(cid:1193)y” quan h(cid:1227) th(cid:1263)a k(cid:1219) gi(cid:1267)a Car và MotorVehicle ngh(cid:429)a là có th(cid:1223) truy nh(cid:1201)p t(cid:1247)i các thành viên mà Car (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) MotorVehicle.

nh(cid:1201)p (cid:133) các thành viên public (cid:70)(cid:1259)a cha (cid:70)(cid:458)ng (cid:255)(cid:1133)(cid:1255)c coi nh(cid:1133) public (cid:70)(cid:1259)a con (cid:133) các thành viên protected (cid:70)(cid:1259)a cha (cid:70)(cid:458)ng (cid:255)(cid:1133)(cid:1255)c coi nh(cid:1133) protected (cid:70)(cid:1259)a

con

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 42 41 9/6/2009 9/6/2009

KiKi(cid:1223)(cid:1223)uu thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

KiKi(cid:1223)(cid:1223)uu thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

class Car : private MotorVehicle

{ ... };

class Car : protected MotorVehicle

{ ... };

(cid:132) Th(cid:1263)a k(cid:1219) private: ch(cid:1229) có chính th(cid:1223) hi(cid:1227)(cid:81) (cid:255)ó bi(cid:1219)t nó (cid:255)(cid:1133)(cid:1255)c

th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) (cid:79)(cid:1247)p cha (cid:133) các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng bên ngoài không th(cid:1223) truy nh(cid:1201)p các thành viên

(cid:132) Khi dùng ki(cid:1223)u th(cid:1263)a k(cid:1219) protected, ngoài l(cid:1247)(cid:83) (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a (cid:78)(cid:1219), ch(cid:1229) có các l(cid:1247)p con (cid:70)(cid:1259)a l(cid:1247)(cid:83) (cid:255)ó nhìn th(cid:1193)y quan h(cid:1227) th(cid:1263)a k(cid:1219)

(cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219)

(cid:132) quan h(cid:1227) “Car th(cid:1263)a k(cid:1219) MotorVehicle” s(cid:1217) (cid:255)(cid:1133)(cid:1255)c nhìn th(cid:1193)y

(cid:132) Nói cách khác, (cid:80)(cid:1233)i thành viên (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) (cid:255)(cid:1221)u tr(cid:1251)

thành private trong l(cid:1247)p con

(cid:87)(cid:1263) (cid:133) bên trong Car (cid:133) các l(cid:1247)p con (cid:70)(cid:1259)a Car

(cid:132) Có th(cid:1223) dùng th(cid:1263)a k(cid:1219) private (cid:255)(cid:1223) (cid:87)(cid:1189)o l(cid:1247)p con có m(cid:1233)i

(cid:132) nói cách khác, các thành viên (cid:255)(cid:1133)(cid:1255)c th(cid:1263)a k(cid:1219) (cid:86)(cid:1217) có quy(cid:1221)n

truy nh(cid:1201)p b(cid:1231) (cid:75)(cid:1189) xu(cid:1237)ng protected.

ch(cid:1261)c n(cid:259)ng/d(cid:1231)ch v(cid:1257) (cid:70)(cid:1259)a l(cid:1247)p cha nh(cid:1133)ng l(cid:1189)i không cho bên ngoài bi(cid:1219)t v(cid:1221) các ch(cid:1261)c n(cid:259)ng (cid:255)ó.

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 43 44 9/6/2009 9/6/2009

TT(cid:1240)(cid:1240)NG HNG H(cid:1254)(cid:1254)PP

KiKi(cid:1223)(cid:1223)u thu th(cid:1263)(cid:1263)a ka k(cid:1219)(cid:1219)

Hình th(cid:1261)c k(cid:1219) th(cid:1263)a

a public 1.1. KK(cid:1219)(cid:1219) thth(cid:1263)(cid:1263)a public (cid:132) Các thành ph(cid:1195)n public

public và protected

private

protected

public

Thành ph(cid:1195)n trong trong (cid:79)(cid:1247)p c(cid:1131) s(cid:1251)

protected (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) protected (cid:70)(cid:1259)a l(cid:1247)p d(cid:1199)n

public và protected

là các thành ph(cid:1195)n public xu(cid:1193)t.

private

Không th(cid:1223) truy c(cid:1201)p

a protected 2.2. KK(cid:1219)(cid:1219) thth(cid:1263)(cid:1263)a protected

protected (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251)

(cid:132) Các thành ph(cid:1195)n public

public và protected protected (cid:70)(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t.

là các thành ph(cid:1195)n protected

protected

private

protected

protected

protected (cid:70)(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251)

a private 3.3. KK(cid:1219)(cid:1219) thth(cid:1263)(cid:1263)a private (cid:132) Các thành ph(cid:1195)n public

public

private

protected

public

public và protected private (cid:70)(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t.

là các thành ph(cid:1195)n private

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 46 45 9/6/2009 9/6/2009

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 47 48 9/6/2009 9/6/2009

MOTOR VEHICLE

CCááii ggìì llàà ccááii ggìì??

CCááii ggìì llàà ccááii ggìì??

- vin - make - model + drive()

(cid:132) Khi làm quen v(cid:1247)i th(cid:1263)a k(cid:1219), ta th(cid:1133)(cid:1249)ng nh(cid:1203)(cid:70) (cid:255)(cid:1219)n

(cid:132) Ta (cid:255)ã nói r(cid:1205)ng t(cid:1133) (cid:87)(cid:1133)(cid:1251)ng c(cid:1259)a th(cid:1263)a k(cid:1219) là

CAR

TRUCK

- passengers

- maximum payload

khai báo các l(cid:1247)p con có m(cid:1233)i thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a l(cid:1247)p cha. (cid:132) Ngh(cid:429)a là, các tuyên b(cid:1237) sau là (cid:255)úng

+ load() + unload()

khái ni(cid:1227)m r(cid:1205)ng m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t có th(cid:1223) (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1237)i x(cid:1265) nh(cid:1133) th(cid:1223) nó là m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) ví d(cid:1257), ta có th(cid:1223) coi m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a Car nh(cid:1133) là m(cid:1245)t

(cid:133) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Car (cid:255)(cid:1221)u là MotorVehicle (cid:133) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Truck (cid:255)(cid:1221)u là MotorVehicle

th(cid:1223) hi(cid:1227)n c(cid:1259)a MotorVehicle

(cid:132) Nh(cid:1133)ng các tuyên b(cid:1237) ng(cid:1133)(cid:1255)c l(cid:1189)i thì không (cid:255)úng (v(cid:1221) (cid:87)(cid:1241)ng quát)

(cid:132) Nh(cid:1133) (cid:89)(cid:1201)y chính xác ngh(cid:429)a là gì? Trong C++, ta

(cid:133) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng MotorVehicle (cid:255)(cid:1221)u là Car (cid:133) (cid:80)(cid:1233)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng MotorVehicle (cid:255)(cid:1221)u là Truck

làm vi(cid:1227)(cid:70) (cid:255)ó nh(cid:1133) th(cid:1219) nào?

(cid:132) Ví d(cid:1257), trong m(cid:1245)t s(cid:1237) tr(cid:1133)(cid:1249)ng h(cid:1255)p, ta có th(cid:1223) ch(cid:1229) (cid:87)(cid:1189)o các xe ch(cid:1189)y b(cid:1205)ng máy là xe ca. Nh(cid:1133)ng trong cây th(cid:1263)a k(cid:1219) (cid:70)(cid:1259)a ta, không có gì (cid:255)òi h(cid:1235)i (cid:85)(cid:1205)ng m(cid:1233)i xe ch(cid:1189)y b(cid:1205)ng máy (cid:255)(cid:1221)u là xe ca

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 50 49 9/6/2009 9/6/2009

CCááii ggìì llàà ccááii ggìì??

CCááii ggìì llàà ccááii ggìì??

(cid:132) Nh(cid:1133) (cid:89)(cid:1201)y, (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a Car có quy(cid:1221)n truy nh(cid:1201)p các thu(cid:1245)c tính

(cid:132) (cid:55)(cid:1133) (cid:87)(cid:1133)(cid:1251)ng (cid:255)ó th(cid:1223) hi(cid:1227)n r(cid:1193)t rõ ràng trong cách ta (cid:255)(cid:1231)nh

ngh(cid:429)a m(cid:1245)t l(cid:1247)p con (cid:133) (cid:80)(cid:1245)t l(cid:1247)p con trên cây th(cid:1263)a k(cid:1219) có m(cid:1233)i thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a

và hành vi sau: (cid:133) thành viên d(cid:1267) li(cid:1227)u: vin, make, model, passengers (cid:133) ph(cid:1133)(cid:1131)ng th(cid:1261)c: drive()

(cid:79)(cid:1247)p cha,

(cid:132) Ng(cid:1133)(cid:1255)c l(cid:1189)i, không có lý gì m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p cha (cid:79)(cid:1189)i có quy(cid:1221)n truy

(cid:133) (cid:70)(cid:1245)ng thêm các thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a riêng l(cid:1247)p con (cid:255)ó (cid:132) Theo ngôn ng(cid:1267) (cid:70)(cid:1259)a C++: (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a m(cid:1245)t l(cid:1247)p con

nh(cid:1201)p t(cid:1247)i thu(cid:1245)c tính/hành vi ch(cid:1229) (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1231)nh ngh(cid:429)a trong l(cid:1247)p con (cid:133) MotorVehicle không th(cid:1223) truy nh(cid:1201)p passengers

(cid:132) (cid:55)(cid:1133)(cid:1131)ng t(cid:1269), các l(cid:1247)p anh-ch(cid:1231)-em không th(cid:1223) truy nh(cid:1201)p các thu(cid:1245)c

tính/hành vi (cid:70)(cid:1259)a nhau (cid:133) (cid:48)(cid:1245)(cid:87) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Car không th(cid:1223) có ph(cid:1133)(cid:1131)ng th(cid:1261)c Load() và UnLoad(),

có th(cid:1223) truy nh(cid:1201)p t(cid:1247)i: (cid:133) (cid:80)(cid:1233)i thu(cid:1245)c tính và hành vi (không ph(cid:1191)i private) (cid:70)(cid:1259)a l(cid:1247)p cha, (cid:133) và các thành viên (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1231)nh ngh(cid:429)a riêng cho l(cid:1247)p con (cid:255)ó.

(cid:70)(cid:458)ng nh(cid:1133) (cid:80)(cid:1245)(cid:87) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Truck không th(cid:1223) có passengers

(cid:132) C++ (cid:255)(cid:1191)m b(cid:1191)o các yêu c(cid:1195)(cid:88) (cid:255)ó nh(cid:1133) th(cid:1219) nào?

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 51 52 9/6/2009 9/6/2009

CCáácc (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng (cid:255)(cid:1133)(cid:255)(cid:1133)(cid:1255)(cid:1255)cc thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) trong

trong C++C++

CCáácc (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng (cid:255)(cid:1133)(cid:255)(cid:1133)(cid:1255)(cid:1255)cc thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) trong

trong C++C++

(cid:132) Các l(cid:1247)p d(cid:1199)n xu(cid:1193)t Car và Truck:

(cid:132) Trong cây th(cid:1263)a k(cid:1219) MotorVehicle, gi(cid:1191) (cid:86)(cid:1265) (cid:80)(cid:1233)i thành viên d(cid:1267) li(cid:1227)u

class Car : public MotorVehicle {

(cid:255)(cid:1221)(cid:88) (cid:255)(cid:1133)(cid:1255)c khai báo protected, và ta s(cid:1265) (cid:71)(cid:1257)ng ki(cid:1223)u th(cid:1263)a k(cid:1219) public

public:

Car(int vin, string make, string model, int passengers); ~Car(); protected:

(cid:132) (cid:47)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) MotorVehicle:

int passengers;

};

class MotorVehicle {

public:

class Truck : public MotorVehicle {

public:

MotorVehicle(int vin, string make, string model); ~MotorVehicle(); void Drive(int speed, int distance);

protected:

Truck(int vin, string make, string model, int maxPayload); ~Truck(); void Load(); void Unload();

int vin; string make; string model;

protected:

};

int maxPayload;

};

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 54 53 9/6/2009 9/6/2009

CCáácc (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng (cid:255)(cid:1133)(cid:255)(cid:1133)(cid:1255)(cid:1255)cc thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) trong

trong C++C++

CCáácc (cid:255)(cid:255)(cid:1237)(cid:1237)ii (cid:87)(cid:1133)(cid:87)(cid:1133)(cid:1255)(cid:1255)ngng (cid:255)(cid:1133)(cid:255)(cid:1133)(cid:1255)(cid:1255)cc thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) trong

trong C++C++

(cid:132) Ta có th(cid:1223) khai báo các th(cid:1223) hi(cid:1227)n c(cid:1259)a các l(cid:1247)(cid:83) (cid:255)ó và s(cid:1265)

(cid:71)(cid:1257)ng chúng nh(cid:1133) th(cid:1219) nào? (cid:133) Thí d(cid:1257), khai báo các con tr(cid:1235) (cid:87)(cid:1247)i 3 (cid:79)(cid:1247)p:

(cid:132) Trong c(cid:1191) ba tr(cid:1133)(cid:1249)ng h(cid:1255)p, ta có th(cid:1223) truy nh(cid:1201)p các ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a l(cid:1247)p cha, do ta (cid:255)ã s(cid:1265) (cid:71)(cid:1257)ng ki(cid:1223)u th(cid:1263)a k(cid:1219) public (cid:133) Thí d(cid:1257):

MotorVehicle* mvPointer; Car* cPointer; Truck* tPointer;

mvPointer->Drive(); cPointer->Drive(); tPointer->Drive();

// Method defined by this class // Method defined by base class // Method defined by base class

(cid:132) (cid:54)(cid:1265) (cid:71)(cid:1257)ng các con tr(cid:1235) (cid:255)(cid:1223) khai báo các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p

(cid:132) Tuy nhiên, các ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:70) (cid:255)(cid:1231)nh ngh(cid:429)a t(cid:1189)i m(cid:1245)t l(cid:1247)p d(cid:1199)n xu(cid:1193)t ch(cid:1229) có

(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng

th(cid:1223) (cid:255)(cid:1133)(cid:1255)c truy nh(cid:1201)p b(cid:1251)i l(cid:1247)(cid:83) (cid:255)ó (cid:132) xét ph(cid:1133)(cid:1131)ng th(cid:1261)c Load() (cid:70)(cid:1259)a l(cid:1247)p Truck

mvPointer->Load(); cPointer->Load(); tPointer->Load();

// Error // Error // Method defined by this class

... mvPointer = new MotorVehicle(10, “Honda”, “S2000”); cPointer = new Car(10, “Honda”, “S2000”, 2); tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); ...

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 55 56 9/6/2009 9/6/2009

Upcast Upcast

Upcast Upcast

(cid:132) Các th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p con th(cid:1263)a k(cid:1219) public có th(cid:1223) (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1237)i x(cid:1265) nh(cid:1133) th(cid:1223)

(cid:132) (cid:264)(cid:76)(cid:1221)(cid:88) (cid:255)áng l(cid:1133)u ý là ta th(cid:1269)c hi(cid:1227)n t(cid:1193)t c(cid:1191) các l(cid:1227)nh gán (cid:255)ó

nó là th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p cha. (cid:133) (cid:87)(cid:1263) th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p con, ta có quy(cid:1221)n truy nh(cid:1201)p các thành viên và

ph(cid:1133)(cid:1131)ng th(cid:1261)c public mà ta có th(cid:1223) truy nh(cid:1201)p t(cid:1263) (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p cha. (cid:132) Do (cid:255)ó, C++ cho phép dùng con tr(cid:1235) (cid:255)(cid:1133)(cid:1255)c khai báo thu(cid:1245)c lo(cid:1189)i con tr(cid:1235)

mà không c(cid:831)n (cid:255)(cid:1241)i ki(cid:1223)u t(cid:1133)(cid:1249)ng minh (cid:133) do (cid:80)(cid:1233)i l(cid:1247)p con (cid:70)(cid:1259)a MotorVehicle (cid:255)(cid:1221)u ch(cid:1203)c ch(cid:1203)n có m(cid:1233)i thành viên và ph(cid:1133)(cid:1131)ng th(cid:1261)c có trong m(cid:1245)t MotorVehicle, vi(cid:1227)c t(cid:1133)(cid:1131)ng tác (cid:89)(cid:1247)i th(cid:1223) hi(cid:1227)n c(cid:1259)a các l(cid:1247)p này nh(cid:1133) th(cid:1223) chúng là MotorVehicle không có chút r(cid:1259)i ro nào

(cid:87)(cid:1247)i l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:255)(cid:1223) ch(cid:1229) (cid:87)(cid:1247)i th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t (cid:133) ta có th(cid:1223) th(cid:1269)c hi(cid:1227)n các l(cid:1227)nh sau:

(cid:133) Ví d(cid:1257), (cid:79)(cid:1227)nh sau (cid:255)ây là h(cid:1255)p l(cid:1227), (cid:69)(cid:1193)t k(cid:1223) mvPointer2 (cid:255)ang tr(cid:1235) (cid:87)(cid:1247)i m(cid:1245)t

MotorVehicle, (cid:80)(cid:1245)t Car, hay (cid:80)(cid:1245)t Truck

MotorVehicle* mvPointer2;

mvPointer2->Drive();

mvPointer2 = mvPointer;

// Point to another MotorVehicle

mvPointer2 = cPointer; mvPointer2 = tPointer;

// Point to a Car // Point to a Truck

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 58 57 9/6/2009 9/6/2009

Upcast Upcast

Upcast Upcast

(cid:132) Upcast là quá trình t(cid:1133)(cid:1131)ng tác v(cid:1247)i th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t nh(cid:1133) th(cid:1223)

nó là th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251).

(cid:132) Upcast th(cid:1133)(cid:1249)ng g(cid:1211)p t(cid:1189)i các (cid:255)(cid:1231)nh ngh(cid:429)a hàm, khi m(cid:1245)t con tr(cid:1235)/tham chi(cid:1219)(cid:88) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:255)(cid:1133)(cid:1255)c yêu c(cid:1195)u, nh(cid:1133)ng con tr(cid:1235)/tham chi(cid:1219)(cid:88) (cid:255)(cid:1219)n l(cid:1247)p d(cid:1199)n xu(cid:1193)t c(cid:458)ng (cid:255)(cid:1133)(cid:1255)c ch(cid:1193)p nh(cid:1201)n (cid:133) xét hàm sau

void sellMyVehicle(MotorVehicle& myVehicle) {...}

(cid:132) (cid:38)(cid:1257) th(cid:1223), (cid:255)ây là vi(cid:1227)(cid:70) (cid:255)(cid:1241)i m(cid:1245)t con tr(cid:1235) (ho(cid:1211)c tham chi(cid:1219)u) (cid:87)(cid:1247)i l(cid:1247)p d(cid:1199)n xu(cid:1193)t thành m(cid:1245)t m(cid:1245)t con tr(cid:1235) (ho(cid:1211)c tham chi(cid:1219)u) (cid:87)(cid:1247)i l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) ta (cid:255)ã th(cid:1193)y ví d(cid:1257) (cid:89)(cid:1221) upcast (cid:255)(cid:1237)i v(cid:1247)i con tr(cid:1235) MotorVehicle* mvPointer2 = cPointer; (cid:133) ví d(cid:1257) (cid:89)(cid:1221) upcast (cid:255)(cid:1237)i v(cid:1247)i tham chi(cid:1219)u

(cid:133) có th(cid:1223) (cid:74)(cid:1233)i sellMyVehicle (cid:80)(cid:1245)t cách h(cid:1255)p l(cid:1227) (cid:89)(cid:1247)i tham s(cid:1237) là m(cid:1245)t tham chi(cid:1219)u t(cid:1247)i m(cid:1245)t MotorVehicle, (cid:80)(cid:1245)t Car, ho(cid:1211)c m(cid:1245)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;

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 60 59 9/6/2009 9/6/2009

Upcast Upcast

Upcast Upcast

(cid:132) Chú ý (cid:85)(cid:1205)ng khi g(cid:1203)n m(cid:1245)t con tr(cid:1235)/tham chi(cid:1219)u l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:89)(cid:1247)i m(cid:1245)t th(cid:1223)

hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, ta không h(cid:1221) thay (cid:255)(cid:1241)i b(cid:1191)n ch(cid:1193)t c(cid:1259)(cid:68) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:87)(cid:1247)i (cid:133) Ví d(cid:1257), (cid:79)(cid:1227)nh

(cid:132) (cid:49)(cid:1219)u ta dùng m(cid:1245)t con tr(cid:1235) (cid:87)(cid:1247)i l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:255)(cid:1223) tr(cid:1235) (cid:87)(cid:1247)i m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, trình biên d(cid:1231)ch s(cid:1217) ch(cid:1229) cho ta coi (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng nh(cid:1133) th(cid:1223) nó thu(cid:1245)c l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) Nh(cid:1133) (cid:89)(cid:1201)y, ta không th(cid:1223) làm nh(cid:1133) sau

MotorVehicle* mvPointer2 = tPointer; // Point to a Truck

MotorVehicle* mvPointer2 = tPointer; // Point to a Truck mvPointer2->Load();

// Error

không làm m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a Truck suy gi(cid:1191)m thành m(cid:1245)t MotorVehicle, nó ch(cid:1229) cho ta m(cid:1245)t cách nhìn khác (cid:255)(cid:1237)i v(cid:1247)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Truck và t(cid:1133)(cid:1131)ng tác (cid:89)(cid:1247)(cid:76) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)ó.

(cid:133) Do (cid:89)(cid:1201)y, ta v(cid:1199)n có th(cid:1223) truy nh(cid:1201)p t(cid:1247)i các thành viên và ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a

(cid:79)(cid:1247)p d(cid:1199)n xu(cid:1193)t ngay c(cid:1191) sau khi gán con tr(cid:1235) (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:87)(cid:1247)i nó:

(cid:133) (cid:264)ó là vì trình biên d(cid:1231)ch không th(cid:1223) (cid:255)(cid:1191)m b(cid:1191)o r(cid:1205)ng con tr(cid:1235) th(cid:1269)c ra

(cid:255)ang tr(cid:1235) (cid:87)(cid:1247)i m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)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)

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 62 61 9/6/2009 9/6/2009

Slicing Slicing

Slicing Slicing

(cid:132) (cid:264)ôi khi ta mu(cid:1237)(cid:81) (cid:255)(cid:1241)i h(cid:1207)n ki(cid:1223)u

(cid:132) Ví d(cid:1257)

(cid:133) Ví d(cid:1257), ta mu(cid:1237)n t(cid:1189)o m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a MotorVehicle d(cid:1269)a trên m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a Car (s(cid:1265) (cid:71)(cid:1257)ng copy constructor cho MotorVehicle)

Car c(10, “Honda”, “S2000”, 2)’ MotorVehicle mv(c);

(cid:132) Slicing là quá trình chuy(cid:1223)n m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t

(cid:132) (cid:1250) (cid:255)ây, (cid:80)(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a MotorVehicle (cid:255)(cid:1133)(cid:1255)c t(cid:1189)o b(cid:1251)i copy constructor ch(cid:1229) gi(cid:1267) (cid:79)(cid:1189)i nh(cid:1267)ng thành viên c(cid:1259)a Car mà có trong MotorVehicle

thành m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) (cid:75)(cid:1255)p l(cid:1227) vì m(cid:1245)t th(cid:1223) hi(cid:1227)n c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t có t(cid:1193)t c(cid:1191) các thành viên

(Car instance)

(MotorVehicle instance)

và ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:70)(cid:1259)a nó

c

mv

(cid:132) Quy trình này g(cid:1233)i là “slicing” vì th(cid:1269)c ch(cid:1193)t ta c(cid:1203)t b(cid:1247)t (slice off) nh(cid:1267)ng thành viên d(cid:1267) li(cid:1227)u và ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:70) (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1231)nh ngh(cid:429)a trong l(cid:1247)p d(cid:1199)n xu(cid:1193)t

vin make model

vin make model passengers

sliced off

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 63 64 9/6/2009 9/6/2009

Slicing Slicing

Downcast Downcast

(cid:132) Upcast là (cid:255)(cid:1241)i con tr(cid:1235)/tham chi(cid:1219)u t(cid:1247)i l(cid:1247)p

(cid:71)(cid:1199)n xu(cid:1193)t thành con tr(cid:1235)/tham chi(cid:1219)u t(cid:1247)i l(cid:1247)p (cid:70)(cid:1131) (cid:86)(cid:1251).

(cid:132) Th(cid:1269)c ra, quy trình này c(cid:458)ng gi(cid:1237)ng h(cid:1227)t nh(cid:1133) khi ta ng(cid:1195)(cid:80) (cid:255)(cid:1241)i gi(cid:1267)a các ki(cid:1223)u d(cid:1267) li(cid:1227)u có s(cid:1209)n và b(cid:1231) (cid:80)(cid:1193)t (cid:69)(cid:1247)t d(cid:1267) li(cid:1227)u (ch(cid:1207)ng h(cid:1189)n khi (cid:255)(cid:1241)i m(cid:1245)t s(cid:1237) ch(cid:1193)m (cid:255)(cid:1245)ng sang (cid:86)(cid:1237) nguyên)

(cid:132) Slicing còn x(cid:1191)y ra khi ta dùng phép gán

(cid:132) Downcast là quy trình ng(cid:1133)(cid:1255)c l(cid:1189)i: (cid:255)(cid:1241)i ki(cid:1223)u con tr(cid:1235)/tham chi(cid:1219)u t(cid:1247)i l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) thành con tr(cid:1235)/tham chi(cid:1219)u t(cid:1247)i l(cid:1247)p d(cid:1199)n xu(cid:1193)t.

(cid:132) downcast là quy trình r(cid:1203)c r(cid:1237)i h(cid:1131)n và có

Car c(10, “Honda”, “S2000”, 2)’ MotorVehicle mv = c;

nhi(cid:1221)(cid:88) (cid:255)(cid:76)(cid:1223)m không an toàn

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 66 65 9/6/2009 9/6/2009

Downcast Downcast

Downcast Downcast

(cid:132) Tr(cid:1133)(cid:1247)c h(cid:1219)t, downcast không ph(cid:1191)i là m(cid:1245)t quy trình t(cid:1269) (cid:255)(cid:1245)ng - nó luôn

(cid:255)òi h(cid:1235)(cid:76) (cid:255)(cid:1241)i ki(cid:1223)u t(cid:1133)(cid:1249)ng minh (explicit type cast)

(cid:132) (cid:49)(cid:1219)u ta bi(cid:1219)t ch(cid:1203)c ch(cid:1203)n r(cid:1205)ng m(cid:1245)t con tr(cid:1235) (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) qu(cid:1191) th(cid:1269)(cid:70) (cid:255)ang tr(cid:1235) (cid:87)(cid:1247)i m(cid:1245)t l(cid:1247)p con, ta có th(cid:1223) (cid:87)(cid:1269) (cid:255)(cid:1241)i ki(cid:1223)u cho con tr(cid:1235) (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:69)(cid:1205)ng cách s(cid:1265) (cid:71)(cid:1257)ng static_cast

(cid:132) (cid:264)(cid:76)(cid:1221)(cid:88) (cid:255)ó là h(cid:1255)p lý

Car* cPointer = new Car(10, “Honda”, “S2000”, 2); MotorVehicle* mv = cPointer;

// Upcast

Car* cPointer2; cPointer2 = static_cast(mv); // Explicit downcast

(cid:133) nh(cid:1247) (cid:79)(cid:1189)i r(cid:1205)ng: không ph(cid:1191)i “m(cid:1233)i xe ch(cid:1189)y b(cid:1205)ng máy (cid:255)(cid:1221)u là xe t(cid:1191)i” (cid:133) do (cid:255)ó, (cid:85)(cid:1203)c r(cid:1237)i s(cid:1217) (cid:81)(cid:1191)y sinh n(cid:1219)u trình biên d(cid:1231)ch cho ta (cid:255)(cid:1241)i m(cid:1245)t con tr(cid:1235) (cid:69)(cid:1193)t (cid:78)(cid:484) (cid:87)(cid:1247)i MotorVehicle thành m(cid:1245)t con tr(cid:1235) (cid:87)(cid:1247)i Truck, trong khi th(cid:1269)c ra con tr(cid:1235) (cid:255)(cid:121) (cid:255)ang tr(cid:1235) (cid:87)(cid:1247)i m(cid:1245)(cid:87) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng Car.

(cid:132) Ví d(cid:1257), (cid:255)(cid:82)(cid:1189)n mã sau s(cid:1217) gây l(cid:1243)i biên d(cid:1231)ch:

(cid:132) Ta có th(cid:1223) th(cid:1193)y m(cid:1237)i nguy hi(cid:1223)m khi làm vi(cid:1227)c này - chuy(cid:1227)n gì x(cid:1191)y ra (cid:81)(cid:1219)(cid:88) (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ta (cid:255)ang c(cid:1237) (cid:255)(cid:1241)i ki(cid:1223)u th(cid:1269)c ra không thu(cid:1245)c l(cid:1247)p mà ta ngh(cid:429)?

Truck* tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); MotorVehicle* mv = tPointer; // Upcast

MotorVehicle* mvPointer3; … Car* cPointer2 = mvPointer3; Truck* tPointer2 = mvPointer3; MotorCycle mcPointer2 = mvPointer3;

// Error // Error // Error

Car* cPointer2; cPointer = static_cast(mv); // Explicit downcast

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 68 67 9/6/2009 9/6/2009

Multiple Inheritance (cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) -- Multiple Inheritance

Downcast Downcast

Truck* tPointer = new Truck(10, “Toyota”, “Tacoma”, 5000); MotorVehicle* mv = tPointer; // Upcast

(cid:132) (cid:264)a th(cid:1263)a k(cid:1219) là d(cid:1189)ng th(cid:1263)a k(cid:1219) ph(cid:1261)c t(cid:1189)p cho phép ta t(cid:1189)o các l(cid:1247)p d(cid:1199)n xu(cid:1193)t th(cid:1263)a k(cid:1219) các thu(cid:1245)c tính và hành vi (cid:87)(cid:1263) nhi(cid:857)u h(cid:767)n m(cid:881)t l(cid:883)p c(cid:767) (cid:86)(cid:887).

Car* cPointer2; cPointer = static_cast(mv); // Explicit downcast

(cid:132) Nên h(cid:1189)n ch(cid:1219) (cid:86)(cid:1265) (cid:71)(cid:1257)ng (cid:255)a th(cid:1263)a k(cid:1219) vì nó có th(cid:1223) (cid:71)(cid:1199)(cid:81) (cid:255)(cid:1219)n

(cid:132) (cid:264)(cid:82)(cid:1189)n mã trên hoàn toàn h(cid:1255)p l(cid:1227) và s(cid:1217) (cid:255)(cid:1133)(cid:1255)c trình biên

(cid:71)(cid:1231)ch ch(cid:1193)p nh(cid:1201)n

(cid:132) Tuy nhiên, (cid:81)(cid:1219)u ch(cid:1189)(cid:92) (cid:255)(cid:82)(cid:1189)n trình trên, ch(cid:1133)(cid:1131)ng trình có th(cid:1223)

(cid:255)(cid:1259) lo(cid:1189)i nh(cid:1195)m l(cid:1199)n do các tên trùng nhau (cid:133) ch(cid:1207)ng h(cid:1189)n n(cid:1219)u th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) hai l(cid:1247)p cùng có ph(cid:1133)(cid:1131)ng th(cid:1261)c Foo() (cid:132) Do tính ph(cid:1261)c t(cid:1189)p ti(cid:1221)m tàng c(cid:1259)(cid:68) (cid:255)a th(cid:1263)a k(cid:1219), (cid:80)(cid:1245)t s(cid:1237) ngôn ng(cid:1267) (cid:79)(cid:1201)p trình (ch(cid:1207)ng h(cid:1189)n Java, C#) không cài (cid:255)(cid:1211)t tính (cid:81)(cid:259)ng này.

(cid:69)(cid:1231) (cid:255)(cid:1241) (cid:89)(cid:1253) (th(cid:1133)(cid:1249)ng là khi l(cid:1195)(cid:81) (cid:255)(cid:1195)u truy nh(cid:1201)(cid:83) (cid:255)(cid:1219)n thành viên/ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:70) (cid:255)(cid:1133)(cid:1255)(cid:70) (cid:255)(cid:1231)nh ngh(cid:429)a c(cid:1259)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t mà ta (cid:255)(cid:1241)i t(cid:1247)i)

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 69 70 9/6/2009 9/6/2009

EMPLOYEE

EMPLOYEE

(cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

(cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

STUDENT * student ID - name - GPA

STUDENT * student ID - name - GPA

* employee ID - name - office number

* employee ID - name - office number

STUDENT-EMPLOYEE

STUDENT-EMPLOYEE

- tuition credit

- tuition credit

(cid:132) Xét m(cid:1245)t h(cid:1227) th(cid:1237)ng qu(cid:1191)n lý (cid:255)(cid:1189)i h(cid:1233)c l(cid:1133)u tr(cid:1267) thông tin (cid:89)(cid:1221) (cid:70)(cid:1191) sinh viên và

nhân viên (cid:133) sinh viên có th(cid:1223) có các thu(cid:1245)c tính ch(cid:1207)ng h(cid:1189)n tên, mã sinh viên, và (cid:255)(cid:76)(cid:1223)m

trung bình

(cid:132) Ta có th(cid:1223) th(cid:1193)y các trùng l(cid:1211)p ti(cid:1221)m tàng trong các thành viên d(cid:1267) li(cid:1227)u, ch(cid:1207)ng h(cid:1189)n l(cid:1247)p Student-Employee th(cid:1263)a k(cid:1219) thành viên name (cid:87)(cid:1263) (cid:70)(cid:1191) hai l(cid:1247)p c(cid:1131) (cid:86)(cid:1251) (cid:133) trong C++, có th(cid:1223) gi(cid:1191)i quy(cid:1219)t r(cid:1203)c r(cid:1237)i do trùng tên này b(cid:1205)ng toán t(cid:1265)

(cid:133) nhân viên có th(cid:1223) có các thu(cid:1245)c tính tên, mã nhân viên, phòng làm vi(cid:1227)c (cid:132) Có th(cid:1223) có nh(cid:1267)ng ng(cid:1133)(cid:1249)i cùng lúc v(cid:1263)a là sinh viên v(cid:1263)a là nhân viên

ph(cid:1189)m vi (cho trình biên d(cid:1231)ch bi(cid:1219)t ta (cid:255)ang nói (cid:255)(cid:1219)n name nào)

(cid:133) có th(cid:1223) sinh viên-nhân viên có thêm thu(cid:1245)c tính n(cid:1255) (cid:75)(cid:1233)c phí (tuition credit)

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 71 72 9/6/2009 9/6/2009

(cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219) -- ccààii (cid:255)(cid:255)(cid:1211)(cid:1211)tt

(cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

(cid:132) Khai báo m(cid:1245)t l(cid:1247)p là d(cid:1199)n xu(cid:1193)t c(cid:1259)a nhi(cid:1221)u l(cid:1247)p c(cid:1131) (cid:86)(cid:1251):

PERSON - name - address - phone number

(cid:132) Ví d(cid:1257) (cid:89)(cid:1221) (cid:255)a th(cid:1263)a k(cid:1219) trong cây th(cid:1263)a k(cid:1219)

class StudentEmployee : public Student, public Employee { ... };

(cid:132) Nguyên lý th(cid:1263)a k(cid:1219) (cid:89)(cid:1199)n

(cid:132) (cid:55)(cid:1189)(cid:76) (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t, constructor (cid:74)(cid:1233)i constructor (cid:70)(cid:1259)a các l(cid:1247)p

(cid:70)(cid:1131) (cid:86)(cid:1251):

EMPLOYEE

StudentEmployee::StudentEmployee (...) : Student(...), Employee(...) {

STUDENT * student ID - GPA

* employee ID - office number

... };

không (cid:255)(cid:1241)i: (cid:79)(cid:1247)p con th(cid:1263)a (cid:78)(cid:1219) (cid:80)(cid:1233)i thu(cid:1245)c tính và hành vi (cid:70)(cid:1259)a l(cid:1247)p cha (cid:133) Trong C++, (cid:255)(cid:76)(cid:1221)(cid:88) (cid:255)ó có

(cid:132) Khi g(cid:1211)p mù m(cid:1249) (cid:89)(cid:1221) tên (ch(cid:1207)ng h(cid:1189)n 2 phiên b(cid:1191)n name th(cid:1263)a k(cid:1219) (cid:87)(cid:1263) 2 (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) trong ví d(cid:1257) tr(cid:1133)(cid:1247)c) ta có th(cid:1223) (cid:86)(cid:1265) (cid:71)(cid:1257)ng toán t(cid:1265) ph(cid:1189)m vi

STUDENT-EMPLOYEE

this->Student::name // Refers to the version of name

// inherited from Student

- tuition credit

this->Employee::name // Refers to this version of name

ngh(cid:429)a l(cid:1247)p d(cid:1199)n xu(cid:1193)t th(cid:1263)a (cid:78)(cid:1219) (cid:80)(cid:1233)i thành viên d(cid:1267) li(cid:1227)u và ph(cid:1133)(cid:1131)ng th(cid:1261)c c(cid:1259)a t(cid:1263)ng (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251)

// inherited from Employee

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 73 74 9/6/2009 9/6/2009

(cid:264)a(cid:264)a thth(cid:1263)(cid:1263)aa kk(cid:1219)(cid:1219)

(cid:132) Trong th(cid:1269)c t(cid:1219), có m(cid:1245)t lo(cid:1189)t các v(cid:1193)(cid:81) (cid:255)(cid:1221) ti(cid:1221)m tàng liên quan (cid:255)(cid:1219)(cid:81) (cid:255)a th(cid:1263)a k(cid:1219), ph(cid:1195)n l(cid:1247)n là do (cid:85)(cid:1203)c r(cid:1237)i vì mù m(cid:1249)

(cid:132) Có th(cid:1223) ta không bao gi(cid:1249) (cid:70)(cid:1195)n dùng (cid:255)(cid:1219)(cid:81) (cid:255)a th(cid:1263)a (cid:78)(cid:1219), nh(cid:1133)ng c(cid:458)ng có nh(cid:1267)ng tình hu(cid:1237)ng mà (cid:255)a th(cid:1263)a k(cid:1219) là l(cid:1249)i gi(cid:1191)i t(cid:1237)t nh(cid:1193)t (và có th(cid:1223) là duy nh(cid:1193)t)

(cid:132) (cid:49)(cid:1219)u s(cid:1265) (cid:71)(cid:1257)ng (cid:255)a th(cid:1263)a k(cid:1219), nh(cid:1193)t thi(cid:1219)t ph(cid:1191)i cân

nh(cid:1203)c v(cid:1221) các xung (cid:255)(cid:1245)t có th(cid:1223) (cid:81)(cid:1191)y sinh trong khi (cid:86)(cid:1265) (cid:71)(cid:1257)ng các l(cid:1247)p có liên quan.

TPT - LTH(cid:264)T TPT - LTH(cid:264)T 76 75 9/6/2009 9/6/2009