[r]
(1)Chương 6
Tương ng b i phứ ộ ương th c oứ ả
Tương ng b i phứ ộ ương th c o công c m nh c aứ ả ụ ủ C++ cho phép t ch c qu n lý đ i tổ ứ ả ố ượng khác theo m t lộ ược đ M t khái ni m khác liên quan là: l p c s tr uồ ộ ệ tượng Chương s trình b y cách s d ng công c đẽ ầ ụ ụ ể xây d ng chự ương trình qu n lý nhi u đ i tả ề ố ượng khác theo m t lộ ược đ th ng nh t.ồ ố ấ
§ Phương th c tĩnh ứ 1.1 L i g i t i phờ ọ ớ ương th c tĩnhứ
Nh bi t m t l p d n xu t đư ế ộ ẫ ấ ược th a k phừ ế ương th c a l p c s ti n b i c a Ví d l p A c s c a B, l pủ ề ố ủ ụ ủ B l i c s c a C, C có l p c s ti n b i B A L p Cạ ủ ề ố th a k phừ ế ương th c c a A B Các phứ ủ ương th c màứ v n nói phẫ ương th c tĩnh Đ tìm hi u thêm vứ ể ể ề cách g i t i phọ ương th c tĩnh, ta xét ví d v l p A, B vàứ ụ ề C nh sau:ư
class A {
public: void xuat()
{
cout << "\n Lop A " ; }
};
class B:public A {
public:
void xuat() {
cout << "\n Lop B " ; }
};
class C:public B {
public:
void xuat() {
cout << "\n Lop C " ; }
};
L p C có l p c s ti n b i A , B C k th a phớ ề ố ế ương th c c a A B Do m t đ i tứ ủ ộ ố ượng c a C s có t i phủ ẽ ương th c xuat Hãy theo rõi câu l nh sau:ứ ệ
C h ; // h đ i tố ượng ki u Cể
h.xuat() ; // G i t i phọ ương th c h.D::xuat()ứ h.B::xuat() ; // G i t i phọ ương th c h.B::xuat()ứ h.A::xuat() ; // G i t i phọ ương th c h.A::xuat()ứ
Các l i g i phờ ọ ương th c ví d đ u xu t phát t đ iứ ụ ề ấ ố tượng h m i l i g i đ u xác đ nh rõ phọ ọ ề ị ương th c c n g i.ứ ầ ọ
Bây gi xét l i g i không ph i t m t bi n đ iờ ọ ả ộ ế ố tượng mà t m t tr Xét câu l nh:ừ ộ ỏ ệ
A *p, *q, *r; // p, q, r tr ki u Aỏ ể A a; // a đ i tố ượng ki u Aể
B b; // b đ i tố ượng ki u Bể C c; // c đ i tố ượng ki u cể
(2)Chúng ta ghi nh m nh đ sauớ ệ ề v tr c a l pề ỏ ủ d n xu t c s :ẫ ấ
Phép gán tr : ỏ Con tr c a l p c s có th dùng đ ch aỏ ủ ể ể ứ đ a ch đ i tị ỉ ố ượng c a l p d n xu t.ủ ẫ ấ
Nh v y c phép gán sau đ u h p l :ư ậ ả ề ợ ệ p = &a ;
q = &b ; r = &c ;
Chúng ta ti p t c xét l i g i phế ụ ọ ương th c t tr p,ứ ỏ q, r:
p->xuat(); q->xuat(); r->xuat();
và lý gi i xem phả ương th c (trong phứ ương th A::xuat, B::xuat C::xuat) g i Câu tr l i nh sau:ọ ả
C câu l nh đ u g i t i phả ệ ề ọ ương th c A::xuat() , cácứ tr p, q r đ u có ki u A.ỏ ề ể
Nh v y có th tóm lư ậ ể ược cách th c g i phứ ọ ương th c tĩnhứ nh sau:ư
Quy t c g i phắ ọ ương th c tĩnh: ứ L i g i t i phờ ọ ương th c tĩnhứ bao gi xác đ nh rõ phờ ị ương th c (trong s phứ ố ương th c trùng tên c a l p có quan h th a k ) đứ ủ ệ ế ược g i:ọ
1 N u l i g i xu t phát t m t đ i tế ọ ấ ộ ố ượng c a l p nào, thìủ phương th c c a l p s đứ ủ ẽ ược g i.ọ
2 N u l i g i xu t phát t m t tr ki u l p nào, thìế ọ ấ ộ ỏ ể phương th c c a l p s đứ ủ ẽ ược g i b t k tr ch a đ a chọ ấ ể ỏ ứ ị ỉ c a đ i tủ ố ượng
1.2 Ví dụ
Xét l p A, B, C D L p B C có chung l p c s A L pớ ớ D d n xu t t C C l p đ u có phẫ ấ ả ề ương th c xuat() Xét hàm:ứ
void hien(A *p) {
p->xuat(); }
Không c n bi t t i đ a ch c a đ i tầ ế ị ỉ ủ ố ượng s truy n cho đ iẽ ề ố tr p, l i g i hàm luôn g i t i phỏ ọ ọ ương th A::xuat() tr p ki u A Nh v y b n câu l nh:ỏ ể ậ ố ệ
hien(&a); hien(&b); hien(&c); hien(&d);
trong hàm main (c a chủ ương trình đây) đ u g i t i A::xuat().ề ọ //CT6-01
// Phuong thuc tinh #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class A
{
private: int n; public:
A() {
n=0; } A(int n1)
(3){ n=n1; }
void xuat() {
cout << "\nLop A: "<< n; }
int getN() {
return n; }
};
class B:public A {
public: B():A()
{ }
B(int n1):A(n1) {
}
void xuat() {
cout << "\nLop B: "<<getN(); }
};
class C:public A {
public:
C():A() { }
C(int n1):A(n1) {
}
void xuat() {
cout << "\nLop C: "<<getN(); }
};
class D:public C {
public: D():C()
{ }
D(int n1):C(n1) {
}
void xuat() {
cout << "\nLop D: "<<getN(); }
};
void hien(A *p) {
p->xuat();
(4)}
void main() {
A a(1); B b(2); C c(3); D d(4); clrscr(); hien(&a); hien(&b); hien(&c); hien(&d); getch(); }
§ S h n ch c a phự ạ ế ủ ương th c tĩnhứ
Ví d sau cho th y s h n ch c a phụ ấ ự ế ủ ương th c tĩnh vi ệ s d ng tính th a k đ phát tri n chử ụ ế ể ể ương trình
Gi s c n xây d ng chả ầ ự ương trình qu n lý thí sinh M i thí sinhả ỗ đ a vào ba thu c tính: H tên, s báo danh t ng m Chư ộ ọ ố ổ ể ương trình g m ba ch c năng: Nh p d li u thí sinh, in d li u thí sinhồ ứ ậ ữ ệ ữ ệ máy in xem - in (in h tên hình, sau l a ch n ho cọ ự ọ ặ in ho c khơng) Chặ ương trình s d ng l p TS (Thí sinh)ử ụ đáp ng đứ ược yêu c u đ t ra.ầ ặ
//CT6-02
// Han che phuong thuc tinh // Lop TS
#include <conio.h> #include <stdio.h> #include <iostream.h>
#include <ctype.h> class TS
{
private:
char ht[25]; int sobd; float td; public:
void nhap() {
cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd;
cout << "Tong diem: " ; cin >> td;
} void in()
{
fprintf(stdprn,"\n\nHo ten: %s", ht); fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td); }
void xem_in() {
int ch;
cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch());
(5)if (ch=='C') this->in(); }
} ; void main()
{
TS t[100]; int i, n;
cout << "\nSo thi sinh: "; cin >> n;
for (i=1; i<=n; ++i) t[i].nhap();
for (i=1; i<=n; ++i) t[i].xem_in(); getch();
}
Gi s Nhà trả ường mu n qu n lý thêm đ a ch c a thí sinh Vìố ả ị ỉ ủ s thay đ i không nhi u, nên không đ đ ng đ nự ổ ề ả ộ ế l p TS mà xây d ng l p m i TS2 d n xu t t l p TS Trong l pớ ự ớ ẫ ấ ớ TS2 đ a thêm thu c tính dc (đ a ch ) phư ộ ị ỉ ương th c nhap, in.ứ C th l p TS2 đụ ể ược đ nh nghĩa nh sau:ị
class TS2:public TS {
private:
char dc[30] ; // Dia chi public:
void nhap() {
TS::nhap();
cout << "Dia chi: " ; fflush(stdin); gets(dc); }
void in() {
TS::in();
fprintf(stdprn,"\nDia chi: %s", dc); }
};
Trong l p TS2 không xây d ng l i phớ ự ương th c xem_in, mà sứ ẽ dùng phương th c xem_in c a l p TS Chứ ủ ương trình m i nh sau:ớ
//CT6-03
// Han che phuong thuc tinh // Lop TS TS2
#include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class TS
{
private:
char ht[25]; int sobd; float td; public:
void nhap() {
(6)if (a[i]<a[l]) hoan_vi(i,l); return;
}
if (a[l] > a[r]) k = l; else
k = r;
if (a[i]>=a[k]) return; else
{
hoan_vi(i,k); shift(k,n); }
}
void heap_sort::sapxep(int *a1, long n) {
long i;
sort::sapxep(a1,n); /* Tao dong */
for (i=n/2 ; i>=1; i) shift(i,n); /* Lap */
for (i=n ; i>=2; i) {
hoan_vi(1,i); shift(1,i-1); }
}
void main() {
long i,n;
struct time t1,t2; int *a, k, tg, sec, hund; n=30000;
a=(int*) malloc((n+1)*sizeof(int)); if (a==NULL)
{
puts("\nLoi BN"); getch();
exit(0); }
sort *s[3]; select_sort ss; quick_sort qs; heap_sort hs;
s[0]=&ss; s[1]=&qs; s[2]=&hs; clrscr();
for (k=0; k<3; ++k) {
srand(5000); for (i=1;i<=n;++i)
a[i]=rand(); gettime(&t1); s[k]->sapxep(a,n); gettime(&t2);
tg = (t2.ti_sec - t1.ti_sec)*100 + t2.ti_hund - t1.ti_hund ;
(7)sec = tg / 100; hund = tg % 100;
printf("\n Sap xep %d %d %d %d %d",k+1, t2.ti_sec,t2.ti_hund,t1.ti_sec,t1.ti_hund);
printf("\n Sap xep %d Thoi gian %d sec %d hund", k+1,sec,hund);
} getch(); }