Tải bản đầy đủ (.pdf) (7 trang)

Lập trình hướng đối tượng - Dẫn xuất và thừa kế

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (111.66 KB, 7 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>chương 5</b>


<b>D n xu t và th a k</b>

<b>ẫ</b>

<b>ấ</b>

<b>ừ</b>

<b>ế</b>



Có 2 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 đó là tính k th aế ừ


(inheritance) và tính tương ng b i (polymorphism). Tính k th aứ ộ ế ừ


cho phép các l p đớ ược xây d ng trên các l pự ớ đã có. Trong chương
này s nói v s th a k c a các l p.ẽ ề ự ừ ế ủ ớ


<b>§ 1. S d n xu t và tính th a k ự ẫ</b> <b>ấ</b> <b>ừ</b> <b>ế</b>


<b>1.1. L p c s và l p d n xu tớ</b> <b>ơ ở</b> <b>ớ</b> <b>ẫ</b> <b>ấ</b>


M t l p độ ớ ược xây d ng th a k m t l p khác g i là l p d nự ừ ế ộ ớ ọ ớ ẫ


xu t. L p dùng đ xây d ng l p d n xu t g i là l p c s .ấ ớ ể ự ớ ẫ ấ ọ ớ ơ ở


L p nào cũng có th là m t l p c s . H n th n a, m t l pớ ể ộ ớ ơ ở ơ ế ữ ộ ớ


có th là c s cho nhi u l p d n xu t khác nhau. Đ 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 các l p dânớ ẫ ấ ạ ể ơ ở ể ự ớ


xu t khác. Ngồi ra m t l p có th d n xu t t nhi u l p c s .ấ ộ ớ ể ẫ ấ ừ ề ớ ơ ở


Dưới đây là m t s s đ v quan h d n xu t c a các l p:ộ ố ơ ồ ề ệ ẫ ấ ủ ớ
<b>S đ 1:ơ ồ</b> 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


<b>S đ 2:ơ ồ</b> L p A là c s c a các l p B, C và Dớ ơ ở ủ ớ


A


B C D


<b>S đ 3:ơ ồ</b> L p D d n xu t t 3 l p A, B, Cớ ẫ ấ ừ ớ


A B C


D


<b>S đ 4:ơ ồ</b> Lược đ d n xu t t ng quátồ ẫ ấ ổ


A B C


D E


F G H


<b>Tính th a k :ừ</b> <b>ế</b> M t l p d n xu t ngoài các thành ph n c aộ ớ ẫ ấ ầ ủ


riêng nó, nó cịn được th a k t t c các thành ph n c a các l pừ ế ấ ả ầ ủ ớ



c s có liên quan. Ví d trong s đ 1 thì l p C đơ ở ụ ơ ồ ớ ược th a k cácừ ế


thành ph n c a các l p B và A. Trong s đ 3 thì l p D đầ ủ ớ ơ ồ ớ ược th aừ


k các thành ph n c a các l p A, B và C. Trong s đ 4 thì l p Gế ầ ủ ớ ơ ồ ớ


được th a k các thành ph n c a các l p D, E, A, B và C. ừ ế ầ ủ ớ
<b>1.2. Cách xây d ng l p dân xu tự</b> <b>ớ</b> <b>ấ</b>


Gi s đã đ nh nghĩaả ử ị các l p A và B. Đ xây d ng l p C dânớ ể ự ớ


xu t t A và B, ta vi t nh sau:ấ ừ ế ư


class C : public A, public B
{


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

private:


// Khai báo các thu c tínhộ


public:


// Các phương th cứ


} ;


<b>1.3. Th a k private và publicừ</b> <b>ế</b>


Trong ví d trên, l p C th a k public các l p A và B. ụ ớ ừ ế ớ N u thayế



t khoá public b ng private, thì s th a k là private. ừ ằ ự ừ ế


<i><b>Chú ý:</b></i> N u b qua khơng dùng t khố thì hi u là private, ví dế ỏ ừ ể ụ


n u đ nh nghĩa:ế ị


class C : public A, B
{


private:


// Khai báo các thu c tínhộ


public:


// Các phương th cứ


} ;


thì A là l p c s public c a C , còn B là l p c s private c a C.ớ ơ ở ủ ớ ơ ở ủ


Theo ki u th a k public thì t t c các thành ph n public c aể ừ ế ấ ả ầ ủ


l p c s cũng là các thành ph n public c a l p d n xu t.ớ ơ ở ầ ủ ớ ẫ ấ


Theo ki u th a k private thì t t c các thành ph n public c aể ừ ế ấ ả ầ ủ


l p c s s tr thành các thành ph n private c a l p d n xu t. ớ ơ ở ẽ ơ ầ ủ ớ ẫ ấ
<b>1.4. Th a k các thành ph n d li u (thu c tính)ừ</b> <b>ế</b> <b>ầ</b> <b>ữ ệ</b> <b>ộ</b>



Các thu c tính c a l p c s độ ủ ớ ơ ở ược th a k trong 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: các thu c tínhư ậ ậ ộ ủ ớ ẫ ấ ẽ ồ ộ


m i khai báo trong đ nh nghĩa l p d n xuớ ị ớ ẫ ất và các thu c tính c aộ ủ


l p c s .ớ ơ ở


Tuy v y trong 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 .ộ ủ ớ ơ ở


<i><b>Chú ý:</b></i> Cho phép đ t trùng tên thu c tính trong các l p c s vàặ ộ ớ ơ ở


l p d n xu t.ớ ẫ ấ
<b>Ví d :ụ</b>


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ó cá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*) và b (ki u int) - khai báo trong Cể ể


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

Trong các phương th c c a C ch cho phép truy nh p tr c ti pứ ủ ỉ ậ ự ế



t i các thu c tính khai báo trong C.ớ ộ
<b>1.5. Th a k phừ</b> <b>ế</b> <b>ương th cứ</b>


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.ớ ẫ ấ


<b>Ví d :ụ</b> Trong chương trình dưới đâ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ứ


<i><b>Chú ý</b></i> 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;
}


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=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();



}


<b>1.6. L p c s và đ i tớ</b> <b>ơ ở</b> <b>ố ượng thành ph nầ</b>


L p c s thớ ơ ở ường được 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 trong 1.5 có thể


thay b ng m t chằ ộ ương trình khác trong đó thay vi c dùng l p cệ ớ ơ


s DIEMở b ng m t thành ph n ki u DIEM trong l pằ ộ ầ ể ớ


HINH_TRON. Chương trình m i có th vi t nh sau:ớ ể ế ư


//CT5-02


// Lop co doi tuong thanh 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;
}


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=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();


}


<b>§ 2. Hàm t o, hàm hu đ i v i tính th a kạ</b> <b>ỷ ố ớ</b> <b>ừ</b> <b>ế</b>


<b> 2.1. L p d n xu t không th a k các hàm t o, hàm hu , toánớ</b> <b>ẫ</b> <b>ấ</b> <b>ừ</b> <b>ế</b> <b>ạ</b> <b>ỷ</b>


<b>t gán c a các l p c sử</b> <b>ủ</b> <b>ớ</b> <b>ơ ở</b>


<b>2.2. Cách xây d ng hàm t o c a l p d n xu tự</b> <b>ạ</b> <b>ủ ớ</b> <b>ẫ</b> <b>ấ</b>


+ Hàm t o c n có các đ i đ kh i gán cho các 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 3 lo i ng v i 3 cách kh i gánể ộ ạ ứ ớ ở


khác nhau:


1. Các thu c tính m i khai báo trong 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 các thu c tínhứ ủ ớ ẫ ấ ể ấ ế ộ


này. Vì v y chúng thậ ường được kh i gán b ng các câu l nh gánở ằ ệ


viết trong 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 các thu c tính c a các đ i tậ ế ộ ủ ố ượng này. Vì
v y đ kh i gán cho các đ i tậ ể ở ố ượng thành ph n c n dùng hàm t oầ ầ ạ


c a l p tủ ớ ương ng. Đi u này đã trình b y trong m c ứ ề ầ ụ §8 ch ng 4. ươ


3. Các thu c tính th a k t các l p c s . Trong l p d n xu tộ ừ ế ừ ớ ở ở ớ ẫ ấ


không được phép truy nh p đ n các thu c tính này. Vì v y đậ ế ộ ậ ể


kh i gán cho các 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 cũng gi ng nh kh i gán cho các đ i tơ ở ứ ố ư ở ố ượng
thành ph n, ch khác nhau ch : Đ kh i gán cho các đ i tầ ỉ ở ỗ ể ở ố ượng
thành ph n ta dùng tên đ i tầ ố ượng thành ph n, còn đ kh i gán choầ ể ở


các thu c tính th a k t các 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 các đ 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 và ụ ụ §6, ví d 1)ụ
<b>2.3. Hàm hu ỷ</b>



Khi m t đ i tộ ố ượng c a l p d n xu t đủ ớ ẫ ấ ược gi i phóng (b hu ),ả ị ỷ


thì các đ i tố ượng thành ph n và các đ i tầ ố ượng th a k t các l pừ ế ừ ớ


c s cũng b gi i phóng theo. Do đó các hàm hu tơ ở ị ả ỷ ương ng sứ ẽ


được g i đ n. ọ ế


Nh v y khi xây d ng hàm hu c a l p d n xu t, chúng ta chư ậ ự ỷ ủ ớ ẫ ấ ỉ


c n quan tâm đ n các thu c tính (khơng ph i là đ i tầ ế ộ ả ố ượng) khai


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=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();
}


<b>§ 12. Toàn th và b ph nể</b> <b>ộ</b> <b>ậ</b>


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

Thông thường khi xem xét, gi i quy t m t bài toán, ta thả ế ộ ường
chia nó thành các bài tốn nh h n. Nói cách khác: M t bài toán l nỏ ơ ộ ớ


bao g m nhi u bài toán b ph n. Khi đó ta có th đ nh nghĩa cácồ ề ộ ậ ể ị


l p cho các bài toán b ph n. L p cho bài toán chung đớ ộ ậ ớ ược d nẫ


xu t t các l p nói trên.ấ ừ ớ


Xét m t thí d đ n gi n là bài tốn qu n lý th vi n. Nó g m 2ộ ụ ơ ả ả ư ệ ồ


bài toán b ph n là qu n lý sách và qu n lý đ c gi . Chúng ta sộ ậ ả ả ọ ả ẽ


xây d ng l p SACH và l p DOC_GIA. Sau đó dùng các l p nàyự ớ ớ ớ


</div>

<!--links-->

×