614 Incremental Development Dietel... MOTOR VEHICLE .... MOTOR VEHICLE ..... MOTOR VEHICLE .... PICKUP TRUCK ...
Trang 1L P TRÌNH
tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com
9/6/2009
Tài li u c
Eckel, Bruce Thinking in C++, 2nd Ed Vol 1.
Chapter 14: Inheritance & Composition
Skip p 612 (Operator Overloading & Inheritance) to p 614 (Incremental Development)
Dietel C++ How to Program, 4th Ed.
Chapter 7: Object-Oriented Programming: Inheritance
N i dung
u
th a k
Object relationship diagram
Cây th a k
inheritance hierarchy
Ví d MotorVehicle
nh ngh a l p MotorVehicle
nh ngh a các l p con
Quy n truy nh p
Access privilege
Ki u th a k Cái gì là cái gì?
trong C++
Upcast Slice Downcast
a th a k
Multiple Inheritance
1 M u
bi u di n m i quan h c bi t gi a các l p.
th a là m t m c cao h n c a tr u t ng hóa, cung c p m t c ch gom chung các l p có liên quan v i nhau thành m t m c khái quát hóa
c tr ng cho toàn b các l p nói trên.
c t ch c thành m t s phân c p k th a.
các l p bên d i nó.
Trang 2TPT - LTH T 5
9/6/2009
bi u di n quan h “là 1”.
t sinh viên là m t ng i
t hình tròn là m t hình ellipse
t tam giác là m t a giác
t cái xe ca “là” xe ng c
t cái xe t i “là” xe ng c
t cái xe máy “là” xe ng c
1 M u
9/6/2009
ph n ánh m i quan h gi a các l p Là công c
ch c và phân c p l p d a vào s chuyên bi t hóa, trong
ó m t vài hàm thành ph n c a l p con là phiên b n
ng:
th a public.
Hàm thành ph n là ph ng th c o
th a private.
Hàm thành ph n không là ph ng th c o.
1 M u
Th a k cho phép ta nh ngh a 1 l p m i, g i
là l p con (subclass) hay l p d n xu t (derived
(superclass) hay l p c s (base class).
p d n xu t s th a k các thành ph n (d
li u, hàm) c a l p c s , ng th i thêm vào
các thành ph n m i, bao hàm c vi c làm “t t
n” ho c làm l i nh ng công vi c mà trong l p
s ch a làm t t ho c không còn phù h p v i
p d n xu t
1 M u
Th a k cho phép nhi u l p có th n
xu t t 1 l p c s
Th a k ng cho phép m t l p có th là
n xu t c a nhi u l p c s
Th a k không ch gi i h n 1 m c: M t
p d n xu t có th là l p c s cho các
p d n xu t khác
1 M u
Trang 3TPT - LTH T 9
9/6/2009
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
p con – subclass (ho c l p d n xu t – derived class)
p c th n trong m t quan h “là”
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
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))
Ta nói r ng l p con “th a k ” l p cha, ho c l p con c d n
xu t t ” l p cha
9/6/2009
quan h i t ng
Tên class
Tên class
(Các) ph ng th c (Các) thu c tính
Object Relationship Diagram
ORD
Public
Protected Private
Class
- privateAttribute
# protectedAttribute
+publicOp()
# protectedOp()
- privateOp()
quan h i t ng
Student
- name
- address
- nextAvailID : int + addSchedule(theSchedule : Schedule, forSemester : Semester) + getSchedule(forSemester : Semester) : Schedule
+ hasPrerequisites(forCourseOffering : CourseOffering) : boolean
# passed(theCourseOffering : CourseOffering) : boolean + getNextAvailID() : int
- studentID
quan h i t ng
Trang 4TPT - LTH T 13
9/6/2009
Tên class
(Các) ph ph ng th ng th c
(Các) thu c tính
Bình th ng: Class bình th ng
In nghiêng: Class thu n o
G ch d i: Object (không ph i class)
Bình th ng: Thu c tính bình th ng
In nghiêng: không s d ng
G ch d i: Thu c tính static
Bình th ng: P ng th c bình th ng
In nghiêng: P ng th c virtual
G ch d i: P ng th c static
quan h i t ng
9/6/2009
CTamGiac
# CDiem P1
# CDiem P2
# CDiem P3 + CTamGiac() + float DienTich() + float ChuVi() + void Ve() +
CTuGiac
# CDiem P1
# CDiem P2
# CDiem P3
# CDiem P4 + CTuGiac() + float DienTich() + float ChuVi() + void Ve() +
CEllipse
# CDiem Tam
# float A
# float B + CEllipse() + float DienTich() + float ChuVi() + void Ve() +
CHinhVe
# int MaLoaiHinhVe + float DienTich() + float ChuVi() + void Ve() +
Ví d
Ta ã làm quen v i quan h th a k , hãy xem ta có th bi u di n
nó trong s quan h i t ng nh th nào
Khi mô t các quan h th a k gi a
các l p trong ORD, ích là
ch rõ s khác bi t gi a các l p
tham gia quan h ó
t l p con khác l p cha a nó ch nào?
các l p con khác nhau ch nào?
MOTOR VEHICLE
- vin
- make
- model + drive()
CAR
- passengers
TRUCK
- maximum payload + load()
+ unload()
Bi u di n m t quan h th a k
gi a hai l p b ng m t m i tên
tr p con n l p cha
MOTOR VEHICLE
CAR
MOTOR VEHICLE
CAR
TRUCK
MOTOR VEHICLE
CAR
TRUCK
Có th bi u di n quan h i nhi u l p con theo m t trong hai ki u sau:
Trang 5TPT - LTH T 17
9/6/2009
Bi u di n các thu c tính và hành vi
Gi p MotorVehicle có các thu c
tính vin (s ng ký xe), make (hãng),
model (ki u), và hành vi drive (lái)
MOTOR VEHICLE
- vin
- make
- model + drive()
CAR
TRUCK
Ta có s : MOTOR VEHICLE
- vin
- make
- model + drive()
i xe t i, xe ca
u có các thu c tính vin, make, model, và hành vi drive
9/6/2009
Bi u di n s khác bi t gi a các l p nh th nào?
u không có gì khác nhau thì ch ng có lý do gì p l p con
Gi , xe ca có thêm thu c tính passengers (s hành khách t a mà
xe có th ch ); xe t i có thêm thu c tính maximum payload (tr ng t i t i a) 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
kê các thu c tính/hành vi mà l p cha không có
n gi n hoá s , không l p l i các thu c tính/hành vi c th a k (có th tìm th y chúng b ng cách “l n theo m i tên”)
nh n m nh các m khác bi t, cho phép d dàng nh n ra lý do cho
vi c l p l p con
Ta có s :
i xe ca u có các thu c tính vin, make, model, và hành vi drive,
kèm theo thu c tính passengers
i xe t u có các thu c tính vin, make, model, và hành vi drive,
kèm theo thu c tính maximum payload và các hành vi load, unload
MOTOR VEHICLE
- vin
- make
- model
+ drive()
CAR
- passengers
TRUCK
- maximum payload + load()
+ unload()
Cây th a k
Các quan h th a k luôn c bi u di n
i các l p con t d i l p cha
nh n m nh b n ch t ph a quan h
Ta ng có th có nhi u t ng th a k , i m i t ng, các l p con ti p
c th a k p cha
t xe ch rác (dump truck) là xe t i, và c ng là xe ch y b ng ng c Ngh a là các l p con c th a k các thu c tính và hành vi a
i l p c bên trên nó
t xe ch rác có m i thu c tính và hành vi a xe ng c , kèm theo
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.
MOTOR VEHICLE
CAR
TRUCK
PICKUP TRUCK
DUMP TRUCK
Trang 6
TPT - LTH T 21
9/6/2009
Ví d MotorVehicle
MOTOR VEHICLE
- vin
- make
- model + drive()
CAR
- passengers
TRUCK
- maximum payload + load()
+ unload()
9/6/2009
Ví d MotorVehicle
MotorVehicle
class MotorVehicle { public:
MotorVehicle(int vin, string make, string model);
~MotorVehicle();
void drive(int speed, int distance);
private:
int vin;
string make;
string model;
};
MOTOR VEHICLE
* vin
- make
- model + drive()
Ví d MotorVehicle
Ti p theo, nh ngh a constructor, destructor,
và hàm drive() ây, ta ch nh ngh a t m drive())
MotorVehicle::MotorVehicle(int vin, string make, string model)
{
this->vin = vin;
this->make = make;
this->model = model;
}
MotorVehicle::~MotorVehicle() {} // We could actually use
// the default destructor void MotorVehicle::drive(int speed, int distance)
{
cout << “Dummy drive() of MotorVehicle.” << endl;
}
Ích l i
n gi n hoá khai báo l p,
tr nguyên lý óng gói c a h ng i t ng
tr tái s ng code (s ng l nh ngh a c a các thành 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
th a k
Ví d MotorVehicle NH NGH A
Trang 7TPT - LTH T 25
9/6/2009
u, ta t o l p con Car
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
dùng 1 u hai ch m, ti p theo là t khoá truy nh p và tên c a l p cha
class MyDerivedClass : <keyword> MyBaseClass { };
class Car : public MotorVehicle
{ public:
Car (int passengers);
~Car();
private:
int passengers;
};
Ch rõ quan h gi a l p con Car
và l p cha MotorVehicle
Ví d MotorVehicle NH NGH A
9/6/2009
Hi n gi constructor a l p Car ch nh n 1 tham s passengers, trong khi các i t ng Car ng có t t c
Car (int passengers);
thành viên c th a k , ta nên truy n thêm tham s cho constructor kh i t o vin, make, model.
Ví d MotorVehicle NH NGH A
sung các tham s cho constructor, ta có khai báo:
class Car : public MotorVehicle
{
public:
Car (int vin, string make, string model, int passengers);
~Car();
private:
int passengers;
};
Quy c: t các tham s cho l p cha lên u danh sách.
Ví d MotorVehicle NH NGH A
Ti p theo, nh ngh a l p m i
i thi u, ta s nh ngh a constructor và (có th ) destructor
Các l p con không th a k constructor và destructor a l p cha, do vi c kh i t o và hu các l p khác nhau là khác nhau
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() {}
Ví d MotorVehicle NH NGH A
Trang 8TPT - LTH T 29
9/6/2009
tr c ti p truy nh p các thành viên d li u c a l p c
thi u tính óng gói : ph i bi t sâu v chi ti t l p c và ph i can thi p
sâu
không tái s ng mã kh i t o c a l p c
không th kh i t o 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 i t ng
p cha ng thêm các tính n ng b sung a l p con
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
y, ta s ng constructor a l p c
Ví d MotorVehicle NH NGH A
9/6/2009
ng constructor a l p c , ta dùng danh sách kh i t o
a constructor (t ng t nh khi kh i t o các h ng thành viên) cách duy nh o ph n thu c v th hi n c a l p cha o tr c nh t
Ta nh ngh a constructor nh sau:
Car::Car(int vin, string make, string model, int passengers)
: MotorVehicle(vin, make, model)
{ this->passengers = passengers;
}
Ta không c n kh i t o các thành viên vin, make, model bên trong constructor a Car a
i constructor a MotorVehicle i các tham s vin, make, model
Ví d MotorVehicle NH NGH A
danh sách kh i t o c a l p d n xu t, trình biên d ch s
ng chèn thêm l i g i constructor nh c a l p
ng minh, i destructor a l p d n xu t, i g i
ng t cho destructor a l p c là không c n thi t
vi c này c th c hi n t ng
Ví d MotorVehicle NH NGH A
Khi t o th hi n c a m t l p
n xu t, các constructor
c g i b u t p c
nh t và chuy n d n v phía
p d n xu t
Khi hu th hi n c a l p d n
xu t, các destructor c g i
u t p d n xu t, lên
n qua các l p c (th
ng c l i)
Ví d MotorVehicle NH NGH A
Trang 9TPT - LTH T 33
9/6/2009
ng t , khai báo và nh ngh a c a l p Truck nh sau:
class Truck : public MotorVehicle {
public:
Truck (int vin, string make,
string model, int maxPayload);
~Truck();
void Load();
void Unload();
private:
int maxPayload;
};
Truck::Truck(int vin, string make,
string model, int maxPayload)
:MotorVehicle(vin, make, model) {
this->maxPayload = maxPayload;
} Truck::~Truck() {}
void Truck::Load() {…}
void Truck::Unload() {…}
Ví d MotorVehicle NH NGH A
9/6/2009
Quy n truy nh p (Access privilege)
Ta ã s ng hai ki u quy n truy nh p cho các thành viên d li u
và ph ng th c public - thành viên/ph ng th c
có th c truy nh p t
i t ng C++ thu c ph m vi private - thành viên/ph ng th c
ch có th c truy nh p t bên trong chính l ó Còn có ki u quy n truy nh p th ba: protected
class Car : public MotorVehicle {
public:
Car ( );
~Car();
private:
int passengers;
};
Quy n truy nh p
là l p c
khai báo private, do ó chúng ch có th
c truy nh p t các th hi n c a MotorVehicle
t c các l p d n xu t không có quy n truy nh p các thành viên
private a MotorVehicle
class MotorVehicle {
private:
int vin;
string make;
string model;
};
void Truck::Load() {
if (this->make == “Ford”) {
} }
p Truck không có quy n truy
nh p thành viên private make
a l p c MotorVehicle
Quy n truy nh p
u không, ta có th c quy n truy nh p vào c u trúc bên 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 p” cho l p d n xu t quy n truy nh p t i m t s thành viên/ph ng th c,
khoá protected quy nh quy n truy nh p cho các thành viên/ph ng th c s c s ng b i l p d n xu t
Trang 10TPT - LTH T 37
9/6/2009
Quy n truy nh p
thành viên/ph ng th c c a m t l p cho các l p d n
nh ng khi t o các cây th a k , ng i ta th ng hay p
quy n truy nh p protected
9/6/2009
Quy n truy nh p
Gi ta mu n các l p con a MotorVehicle có th truy nh p d
li u c a nó Thay t khoá private ng protected,
ta có khai báo:
class MotorVehicle {
protected:
int vin;
string make; string model; };
void Truck::Load() {
if (this->make == “Ford”) {
} }
y, n mã sau s không có l i Tuy nhiên truy nh p t bên ngoài
p Truck ã có quy n truy nh p thành viên protected make
a l p c MotorVehicle
Quy n truy nh p
Các quy n truy nh p có vai trò gì trong
quan h th a k ?
Bây gi , ta chuy n sang cách s ng các
khoá quy n truy nh p trong khai báo
ch ki u th a k
class Car : public MotorVehicle { };
Quy n truy nh p
Các quy n truy nh p có vai trò gì trong quan h
th a k ? Bây gi , ta chuy n sang cách s ng các t khoá quy n truy nh p trong khai báo l ch
ki u th a k
class Car : private MotorVehicle { };
class Car : protected MotorVehicle { };
class Car : public MotorVehicle { };
Trang 11TPT - LTH T 41
9/6/2009
Ki u th a k
ng
nó quy nh nh ng ai có th "nhìn th y" quan h th a k ó
Nh c l i: p Car th a k p MotorVehicle có ngh a các
i t ng Car ng có các thành viên d li u và ph ng
th c c a MotorVehicle.
“nhìn th y” quan h th a k gi a Car và MotorVehicle ngh a là
có th truy nh p t i các thành viên mà Car c th a k
MotorVehicle.
9/6/2009
Ki u th a k
Th a k public (lo i thông d ng nh t): quan h th a k c nhìn
th y t i n i
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
có th truy nh p m i thành viên/ph ng th c public a l p cha
nói cách khác, các thành viên c th a k gi nguyên quy n truy
nh p 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
class Car : public MotorVehicle { };
Ki u th a k
các i t ng bên ngoài không th truy nh p các thành viên
c th a k
thành private trong l p con
ch c n ng/d ch v a l p cha nh ng l i không cho bên
ngoài bi t v các ch c n ng ó.
class Car : private MotorVehicle { };
Ki u th a k
, ch có các l p con a l ó nhìn th y quan h
th a k
bên trong Car các l p con a Car
class Car : protected MotorVehicle { };
Trang 12TPT - LTH T 45
9/6/2009
Ki u th a k
là các thành ph n public public và protected a l p d n
xu t.
là các thành ph n protected a l p d n xu t.
là các thành ph n private a l p d n xu t.
9/6/2009
Thành ph n trong trong
p c s
Hình th c k th a
T NG H P
Trang 13TPT - LTH T 49
9/6/2009
Cái gì là cái gì?
khái ni m r ng m t th hi n c a l p d n xu t có
p c
ví d , ta có th coi m t th hi n c a Car nh là m t
th hi n c a MotorVehicle
Nh y chính xác ngh a là gì? Trong C++, ta
9/6/2009
Cái gì là cái gì?
Ta ã nói r ng t ng c a th a k là khai báo các l p con có m i
thu c tính và hành vi a l p cha.
Ngh a là, các tuyên b sau là úng
i t ng Car u là MotorVehicle
i t ng Truck u là MotorVehicle
Nh ng các tuyên b ng c l i thì không úng (v ng quát)
i t ng MotorVehicle u là Car
i t ng MotorVehicle u là Truck
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
MOTOR VEHICLE
- vin
- make
- model + drive()
CAR
- passengers
TRUCK
- maximum payload + load()
+ unload()
Cái gì là cái gì?
ng ó th hi n r t rõ ràng trong cách ta nh
ngh a m t l p con
t l p con trên cây th a k có m i thu c tính và hành vi a
p cha,
ng thêm các thu c tính và hành vi a riêng l p con ó
có th truy nh p t i:
i thu c tính và hành vi (không ph i private) a l p cha,
và các thành viên nh ngh a riêng cho l p con ó.
Cái gì là cái gì?
Nh y, t th hi n c a Car có quy n truy nh p các thu c tính
và hành vi sau:
thành viên d li u: vin, make, model, passengers
ph ng th c: drive()
Ng c l i, không có lý gì m t th hi n c a l p cha i có quy n truy
nh p t i thu c tính/hành vi ch nh ngh a trong l p con
MotorVehiclekhông th truy nh p passengers
ng t , các l p anh-ch -em không th truy nh p các thu c tính/hành vi a nhau
i t 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?