1. Trang chủ
  2. » Giáo án - Bài giảng

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

19 186 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 574,22 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

614 Incremental Development Dietel... MOTOR VEHICLE .... MOTOR VEHICLE ..... MOTOR VEHICLE .... PICKUP TRUCK ...

Trang 1

L 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 2

TPT - 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 3

TPT - 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 4

TPT - 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 5

TPT - 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 7

TPT - 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 8

TPT - 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 9

TPT - 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 10

TPT - 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 11

TPT - 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 12

TPT - 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 13

TPT - 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?

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

HÌNH ẢNH LIÊN QUAN

Hình th c k th a private protected public - Bài giảng lập trình hướng đối tượng kế thừa   trần phước tuấn
Hình th c k th a private protected public (Trang 12)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN