Lập trình hướng đối tượng - Tương ứng bội và phương thức ảo

7 37 0
Lập trình hướng đối tượng - Tương ứng bội và phương thức ảo

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

Thông tin tài liệu

[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(); }

Ngày đăng: 09/03/2021, 03:47

Tài liệu cùng người dùng

Tài liệu liên quan