[r]
(1)chương 5
D n xu t th a kẫ ấ ừ ế
Có khái ni m r t quan tr ng làm nên toàn b th m nh c aệ ấ ọ ộ ế ủ
phương pháp l p trình hậ ướng đ i tố ượng tính k th aế
(inheritance) tính tương ng b i (polymorphism) Tính k th aứ ộ ế
cho phép l p đớ ược xây d ng l pự có Trong chương s nói v s th a k c a l p.ẽ ề ự ế ủ
§ S d n xu t tính th a k ự ẫ ấ ừ ế
1.1 L p c s l p d n xu tớ ơ ở ớ ẫ ấ
M t l p độ ược xây d ng th a k m t l p khác g i l p d nự ế ộ ọ ẫ
xu t L p dùng đ xây d ng l p d n xu t g i l p c s ấ ể ự ẫ ấ ọ
L p có th m t l p c s H n th n a, m t l pớ ể ộ ế ữ ộ
có th c s cho nhi u l p d n xu t khác Đ n lể ề ẫ ấ ế ượt mình, l p d n xu t l i có th dùng làm c s đ xây d ng l p dânớ ẫ ấ ể ể ự
xu t khác Ngoài m t l p có th d n xu t t nhi u l p c s ấ ộ ể ẫ ấ ề
Dưới m t s s đ v quan h d n xu t c a l p:ộ ố ề ệ ẫ ấ ủ S đ 1:ơ ồ L p B d n xu t t l p A, l p C d n xu t t l p Bớ ẫ ấ ớ ẫ ấ
A
B
C
S đ 2:ơ ồ L p A c s c a l p B, C Dớ ủ
A
B C D
S đ 3:ơ ồ L p D d n xu t t l p A, B, Cớ ẫ ấ
A B C
D
S đ 4:ơ ồ Lược đ d n xu t t ng quátồ ẫ ấ ổ
A B C
D E
F G H
Tính th a k :ừ ế M t l p d n xu t thành ph n c aộ ẫ ấ ầ ủ
riêng nó, cịn th a k t t c thành ph n c a l pừ ế ấ ả ầ ủ
c s có liên quan Ví d s đ l p C ụ ược th a k cácừ ế
thành ph n c a l p B A Trong s đ l p D đầ ủ ớ ược th aừ
k thành ph n c a l p A, B C Trong s đ l p Gế ầ ủ ớ
được th a k thành ph n c a l p D, E, A, B C ế ầ ủ 1.2 Cách xây d ng l p dân xu tự ớ ấ
Gi s đ nh nghĩaả ị l p A B Đ xây d ng l p C dânớ ể ự
xu t t A B, ta vi t nh sau:ấ ế
class C : public A, public B {
(2)private:
// Khai báo thu c tínhộ
public:
// Các phương th
} ;
1.3 Th a k private publicừ ế
Trong ví d trên, l p C th a k public l p A B ụ ế N u thayế
t khoá public b ng private, s th a k private ằ ự ế
Chú ý: N u b qua không dùng t khố hi u private, ví dế ỏ ể ụ
n u đ nh nghĩa:ế ị
class C : public A, B {
private:
// Khai báo thu c tínhộ
public:
// Các phương th
} ;
thì A l p c s public c a C , B l p c s private c a C.ớ ủ ủ
Theo ki u th a k public t t c thành ph n public c aể ế ấ ả ầ ủ
l p c s thành ph n public c a l p d n xu t.ớ ầ ủ ẫ ấ
Theo ki u th a k private t t c thành ph n public c aể ế ấ ả ầ ủ
l p c s s tr thành thành ph n private c a l p d n xu t ẽ ầ ủ ẫ ấ 1.4 Th a k thành ph n d li u (thu c tính)ừ ế ầ ữ ệ ộ
Các thu c tính c a l p c s độ ủ ược th a k l p d n xu t.ừ ế ẫ ấ
Nh v y t p thu c tính c a l p d n xu t s g m: thu c tínhư ậ ậ ộ ủ ẫ ấ ẽ ộ
m i khai báo đ nh nghĩa l p d n xuớ ị ẫ ất thu c tính c aộ ủ
l p c s
Tuy v y l p d n xu t không cho phép truy nh p đ n cácậ ẫ ấ ậ ế
thu c tính private c a l p c s ộ ủ
Chú ý: Cho phép đ t trùng tên thu c tính l p c s vàặ ộ
l p d n xu t.ớ ẫ ấ Ví d :ụ
class A {
private: int a, b, c; public:
};
class B {
private:
double a, b, x; public:
};
class C : public A, B {
private:
char *a , *x ; int b ; public:
};
Khi l p C s có thu c tính:ớ ẽ ộ
A::a , A::b, A::c (ki u int) - th a k t Aể ế
B::a , B::b, B::x (ki u double) - th a k t Bể ế
a, x (ki u char*) b (ki u int) - khai báo Cể ể
(3)Trong phương th c c a C ch cho phép truy nh p tr c ti pứ ủ ỉ ậ ự ế
t i thu c tính khai báo C.ớ ộ 1.5 Th a k phừ ế ương th cứ
Tr :ừ
+ Hàm t oạ
+ Hàm huỷ
+ Toán t gánử
các phương th c (public) khác c a l p c s đứ ủ ược th a k trongừ ế
l p d n xu t.ớ ẫ ấ
Ví d :ụ Trong chương trình đây: + Đ u tiên đ nh nghĩa l p DIEM có:ầ ị
Các thu c tính x, yộ
Hai hàm t oạ
Phương th c in()ứ
+ Sau xây d ng l p HINH_TRON d n xu t t l p DIEM,ự ẫ ấ
đ a thêm:ư
Thu c tính rộ
Hai hàm t oạ
Phương th c getRứ
Chú ý cách dùng hàm t o c a l p c s (l p DIEM) đ xâyạ ủ ể
d ng hàm t o c a l p d n xu t.ự ủ ẫ ấ
+ Trong hàm main:
Khai báo đ i tố ượng h ki u HINH_TRONể
S d ng phử ụ ương th c in() đ i v i h (s th a k )ứ ố ự ế
S d ng phử ụ ương th c getR đ i v i h ứ ố
//CT5-01 // Lop co so
#include <conio.h>
#include <iostream.h> class DIEM
{
private:
double x, y; public:
DIEM() {
x = y =0.0; }
DIEM(double x1, double y1) {
x = x1; y = y1; }
void in() {
cout << "\nx= " << x << " y= " << y; }
};
class HINH_TRON : public DIEM {
private: double r; public:
HINH_TRON() {
r = 0.0; }
(4)HINH_TRON(double x1, double y1, double r1): DIEM(x1,y1) {
r = r1; }
double getR() {
return r; }
}; void main()
{
HINH_TRON h(2.5,3.5,8); clrscr();
cout << "\nHinh tron co tam: "; h.in();
cout << "\nCo ban kinh= " << h.getR(); getch();
}
1.6 L p c s đ i tớ ơ ở ố ượng thành ph nầ
L p c s thớ ường x lý gi ng nh m t thành ph n ki uử ố ộ ầ ể
đ i tố ượng c a l p d n xu t Ví d chủ ẫ ấ ụ ương trình 1.5
thay b ng m t chằ ộ ương trình khác thay vi c dùng l p cệ
s DIEMở b ng m t thành ph n ki u DIEM l pằ ộ ầ ể
HINH_TRON Chương trình m i có th vi t nh sau:ớ ể ế
//CT5-02
// Lop co doi tuong phan #include <conio.h>
#include <iostream.h> class DIEM
{
private:
double x, y; public:
DIEM() {
x = y =0.0; }
DIEM (double x1, double y1) {
x = x1; y = y1; }
void in() {
cout << "\nx= " << x << " y= " << y; }
} ;
class HINH_TRON {
private: DIEM d; double r; public:
HINH_TRON() : d() {
r = 0.0; }
(5)HINH_TRON(double x1, double y1, double r1): d(x1,y1) {
r = r1; } void in()
{ d.in(); }
double getR() {
return r; }
}; void main()
{
HINH_TRON h(2.5,3.5,8); clrscr();
cout << "\nHinh tron co tam: "; h.in();
cout << "\nCo ban kinh= " << h.getR(); getch();
}
§ Hàm t o, hàm hu đ i v i tính th a kạ ỷ ố ớ ừ ế
2.1 L p d n xu t không th a k hàm t o, hàm hu , toánớ ẫ ấ ừ ế ạ ỷ
t gán c a l p c sử ủ ớ ơ ở
2.2 Cách xây d ng hàm t o c a l p d n xu tự ạ ủ ớ ẫ ấ
+ Hàm t o c n có đ i đ kh i gán cho thu c tính (thànhạ ầ ố ể ộ
ph n d li u) c a l p.ầ ữ ệ ủ
+ Có th phân thu c tính làm lo i ng v i cách kh i gánể ộ ứ
khác nhau:
1 Các thu c tính m i khai báo l p d n xu t Trong cácộ ớ ẫ ấ
phương th c c a l p d n xu t có th truy xu t đ n thu c tínhứ ủ ẫ ấ ể ấ ế ộ
này Vì v y chúng thậ ường kh i gán b ng câu l nh gánở ằ ệ
viết thân hàm t o
2 Các thành ph n ki u đ i tầ ể ố ượng Trong l p d n xu t khôngớ ẫ ấ
cho phép truy nh p đ n thu c tính c a đ i tậ ế ộ ủ ố ượng Vì v y đ kh i gán cho đ i tậ ể ố ượng thành ph n c n dùng hàm t oầ ầ
c a l p tủ ương ng Đi u trình b y m c ứ ề ầ ụ §8 ch ng ươ
3 Các thu c tính th a k t l p c s Trong l p d n xu tộ ế ở ẫ ấ
không phép truy nh p đ n thu c tính Vì v y đậ ế ộ ậ ể
kh i gán cho thu c tính nói trên, c n s d ng hàm t o c a l pở ộ ầ ụ ủ
c s Cách th c gi ng nh kh i gán cho đ i tơ ứ ố ố ượng thành ph n, ch khác ch : Đ kh i gán cho đ i tầ ỉ ỗ ể ố ượng thành ph n ta dùng tên đ i tầ ố ượng thành ph n, đ kh i gán choầ ể
các thu c tính th a k t l p c s ta dùng tên l p c s :ộ ế ở
Tên_đ i_tố ượng_thành_ph n(danh sách giá tr ) ầ ị
Tên_l p_c _s (danh sách giá tr ) ị
Danh sách giá tr l y t đ i c a hàm t o c a l p d n xu tị ấ ố ủ ủ ẫ ấ
đang xây d ngự
(xem ví d m c 2.4 ụ ụ §6, ví d 1)ụ 2.3 Hàm hu ỷ
Khi m t đ i tộ ố ượng c a l p d n xu t đủ ẫ ấ ược gi i phóng (b hu ),ả ị ỷ
thì đ i tố ượng thành ph n đ i tầ ố ượng th a k t l pừ ế
c s b gi i phóng theo Do hàm hu tơ ị ả ỷ ương ng sứ ẽ
được g i đ n ọ ế
Nh v y xây d ng hàm hu c a l p d n xu t, chư ậ ự ỷ ủ ẫ ấ ỉ
c n quan tâm đ n thu c tính (khơng ph i đ i tầ ế ộ ả ố ượng) khai
(6){
y.x[i]=0;
for (j=1; j<=n; ++j) y.x[i] += a[i][j]*x.x[j]; }
return y; }
void VT::nhap() {
int n,i;
n = this->getN(); if (n==0)
{
this->CAP::nhap(); n = this->getN(); }
for (i=1; i<=n; ++i) {
cout << " PT thu " << i << " = "; cin >> x[i];
} }
void VT::xuat() {
int n,i;
n = this->getN(); if (n)
{
cout << "\n";
for (int i=1; i<=n; ++i) {
cout << x[i] << " "; }
} }
void main() {
MT a; VT x,y; clrscr();
cout<<"\nNhap ma tran A:"; a.nhap();
cout<<"\n\nNhap Vec to X:\n"; x.nhap();
y = a*x;
cout<<"\n\nMa tran A"; a.xuat();
cout<<"\n\nVec to X"; x.xuat();
cout<<"\n\nVec to Y=AX"; y.xuat();
getch(); }
§ 12 Tồn th b ph nể ộ ậ
(7)Thông thường xem xét, gi i quy t m t toán, ta thả ế ộ ường chia thành tốn nh h n Nói cách khác: M t toán l nỏ ộ
bao g m nhi u tốn b ph n Khi ta có th đ nh nghĩa cácồ ề ộ ậ ể ị
l p cho toán b ph n L p cho toán chung đớ ộ ậ ược d nẫ
xu t t l p nói trên.ấ
Xét m t thí d đ n gi n toán qu n lý th vi n Nó g m 2ộ ụ ả ả ệ
bài toán b ph n qu n lý sách qu n lý đ c gi Chúng ta sộ ậ ả ả ọ ả ẽ
xây d ng l p SACH l p DOC_GIA Sau dùng l p nàyự ớ