You are on page 1of 59

3. 3.

Ke Ke thua thua
1
3. 3. Ke Ke thua thua
Noi dung Noi dung
1. 1. M au M au
2. 2. Ke tha n Ke tha n
3. 3. Pham vi truy xuat Pham vi truy xuat
4. 4. Phng thc thiet lap va huy bo Phng thc thiet lap va huy bo
2
4. 4. Phng thc thiet lap va huy bo Phng thc thiet lap va huy bo
5. 5. Con tro va ke tha Con tro va ke tha
1 Mo au 1 Mo au
- S ke tha la mot ac iem cua ngon ng dung e bieu
dien moi quan he ac biet gia cac lp. Cac lp c tru
tng hoa va to chc thanh mot s o phan cap lp.
- Ke tha la mot c che tru tng hoa. Thu tuc va ham la c
che tru tng hoa cho giai thuat, record va struct la tru
tng hoa cho d lieu. Khai niem lp trong C++, ket hp
d lieu va thu tuc e c kieu d lieu tru tng vi giao
3
d lieu va thu tuc e c kieu d lieu tru tng vi giao
dien oc lap vi cai at va cho ngi s dung cam giac
thoai mai nh kieu d lieu co san
- S ke tha la mot mc cao hn cua tru tng hoa. cung
cap mot c che gom chung cac lp co lien quan vi nhau
thanh mot mc khai quat hoa ac trng cho toan bo cac lp
noi tren. Cac lp vi cac ac iem tng t nhau co the
c to chc thanh mot s o phan cap ke tha. Lp
tren cung la tru tng hoa cua toan bo cac lp o ben di
no.
Mo au Mo au
Quan he la 1: Ke tha c s dung thong dung nhat e
bieu dien quan he la mot.
Mot sinh vien la mot ngi
Mot hnh tron la mot hnh ellipse
Mot tam giac la mot a giac
Ke tha tao kha nang xay dng lp mi t lp a co, trong
o ham thanh phan c tha hng t lp cha. Trong
4
o ham thanh phan c tha hng t lp cha. Trong
C++, ke tha con nh ngha s tng thch, nh o ta co
c che chuyen kieu t ong.
Ke tha va co kha nang tao c che khai quat hoa va co
kha nang chuyen biet hoa.
Ke tha cho phep to chc cac lp chia se ma chng trnh
chung nh vay co the de dang sa cha, nang cap he
thong.
Mo au Mo au
Ke tha thng c dung theo hai cach:
e phan anh moi quan he gia cac lp. La cong cu e
to chc va phan cap lp da vao s chuyen biet hoa,
trong o mot vai ham thanh phan cua lp con la phien
ban hoan thien hoac ac biet hoa cua phien ban lp
cha. Trong C++ moi quan he nay thng c cai at
s dung:
5
s dung:
Ke tha public.
Ham thanh phan la phng thc ao
e phan anh s chia se ma chng trnh gia cac lp
khong co quan he ve mat ng ngha nhng co the co to
chc d lieu va ma chng trnh tng t nhau. Trong
C++, c che chia se ma nay thng c cai at dung:
Ke tha private.
Ham thanh phan khong la phng thc ao.
2 Ke thua on 2 Ke thua on
Ke tha co the c thc hien e the hien moi quan he 'la
mot'.
Xet hai khai niem ngi va sinh vien vi moi quan he t
nhien: mot 'sinh vien' la mot 'ngi'. Trong C++, ta co the
bieu dien khai niem tren, mot sinh vien la mot ngi co
them mot so thong tin va mot so thao tac (rieng biet cua
sinh vien).
6
sinh vien).
Ta to chc lp sinh vien ke tha t lp ngi. Lp ngi
c goi la lp cha (superclass) hay lp c s (base class).
Lp sinh vien c goi la lp con (subclass) hay lp dan
xuat (derived class).
Ke thua on Ke thua on
class Nguoi
{
friend class SinhVien;
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {HoTen =
strdup(ht);}
7
strdup(ht);}
~Nguoi() {delete [] HoTen;}
void An() const { cout << HoTen << " an 3 chen
com";}
void Ngu() const { cout << HoTen << " ngu ngay
8 tieng";}
void Xuat() const;
friend ostream& operator << (ostream &os,
Nguoi& p);
};
Ke thua on Ke thua on
class SinhVien : public Nguoi
{
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) :
Nguoi(ht,ns) { MaSo = strdup(ms);}
~SinhVien() {delete [] MaSo;}
void Xuat() const;
8
void Xuat() const;
};
ostream& operator << (ostream &os, Nguoi& p)
{
return os << "Nguoi, ho ten: " << p.HoTen << "
sinh " << p.NamSinh;
}
Ke thua on Ke thua on
void Nguoi::Xuat() const
{
cout << "Nguoi, ho ten: " << HoTen << " sinh "
<< NamSinh;
}
void SinhVien::Xuat() const
{
9
{
cout << "Sinh vien, ma so: " << MaSo << ", ho
ten: " << HoTen;
}
Ke thua on Ke thua on
void main()
{
Nguoi p1("Le Van Nhan",1980);
SinhVien s1("Vo Vien Sinh", "200002541",1984);
cout << 1.\n";
p1.An(); cout << "\n";
s1.An();cout << "\n";
10
s1.An();cout << "\n";
cout << 2.\n";
p1.Xuat(); cout << "\n";
s1.Xuat(); cout << "\n";
s1.Nguoi::Xuat(); cout << "\n";
cout << "3.\n";
cout << p1 << "\n";
cout << s1 << "\n";
}
Tu ong ke thua cac ac tnh cua Iop cha Tu ong ke thua cac ac tnh cua Iop cha
Khai bao
class SinhVien : public Nguoi
{
//...
};
Cho biet lp sinh vien ke tha t lp ngi. Khi o sinh
vien c tha hng cac ac tnh cua lp ngi.
11
vien c tha hng cac ac tnh cua lp ngi.
Ve mat d lieu: Moi oi tng sinh vien t ong co thanh
phan d lieu ho ten va nam sinh cua ngi.
Ve mat thao tac: Lp sinh vien c t ong ke tha cac
thao tac cua lp cha. ay chnh la kha nang s dung lai ma
chng trnh.
Rieng phng thc thiet lap khong c ke tha.
Tu ong ke thua cac ac tnh cua Iop cha Tu ong ke thua cac ac tnh cua Iop cha
Nguoi p1("Le Van Nhan",1980);
SinhVien s1("Vo Vien Sinh", "200002541",1984);
p1.An(); cout << "\n";
s1.An();cout << "\n"; // Tu lop Nguoi
p1.Xuat(); cout << "\n";
12
p1.Xuat(); cout << "\n";
Ke tha public nh tren ham y rang mot oi tng sinh
vien la mot oi tng ngi. Ni nao ch i mot oi
tng ngi co the a vao o mot oi tng sinh vien
(c/kieu).
Kha nang tha hng cac thao tac cua lp c s co the
c truyen qua vo han mc.
jnh nghia Iai thao tac o Iop con jnh nghia Iai thao tac o Iop con
Ta co the nh ngha lai cac ac tnh lp con a co lp
cha, viec nh ngha chu yeu la thao tac, bang cach khai
bao giong het nh lp cha.
class SinhVien : public Nguoi
{
char *MaSo;
public:
//...
13
//...
void Xuat() const;
};
void SinhVien::Xuat() const
{
cout << "Sinh vien, ma so: " << MaSo << ", ho
ten: " << HoTen;
}
Viec nh ngha lai thao tac lp con c thc hien khi
thao tac lp con khac thao tac lp cha. Thong thng la
cac thao tac xuat, nhap.
Ta cung co the nh ngha lai thao tac lp con trong
trng hp giai thuat lp con n gian hn (to mau a
giac, tnh modun cua so ao...).
class DaGiac
jnh nghia Iai thao tac o Iop con jnh nghia Iai thao tac o Iop con
14
class DaGiac
{
// ...
void Ve() const;
void ToMau() const;
};
class HCN
{
void ToMau() const;
};
jnh nghia Iai thao tac o Iop con jnh nghia Iai thao tac o Iop con
Hoac lp con, thao tac khong co tac dung
class Ellipse
{
//...
public:
//...
void rotate(double rotangle){ //...}
};
15
};
class Circle:public Ellipse
{
public:
//...
void rotate(double rotangle){/* do nothing */}
};
3 Rang buoc ngu nghia o Iop con 3 Rang buoc ngu nghia o Iop con
Ke tha co the c ap dung cho quan he ke tha mang y
ngha rang buoc, oi tng lp con la oi tng lp cha
nhng co d lieu b rang buoc.
Hnh tron la Ellipse rang buoc ban knh ngang doc bang
nhau.
So ao la so phc rang buoc phan thc bang 0.
Hnh vuong la hnh ch nhat rang buoc hai canh ngang
16
Hnh vuong la hnh ch nhat rang buoc hai canh ngang
va doc bang nhau
Trong trng hp nay, cac ham thanh phan phai bao am
s rang buoc d lieu c ton trong. Lp so ao sau ay la
mot v du minh hoa.
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
class Complex
{
friend ostream& operator <<(ostream&, Complex);
friend class Imag;
double re, im;
public:
Complex(double r = 0, double i = 0):re(r),
im(i){}
17
im(i){}
Complex operator +(Complex b);
Complex operator -(Complex b);
Complex operator *(Complex b);
Complex operator /(Complex b);
double Norm() const {return sqrt(re*re +
im*im);}
};
class Imag: public Complex
{
public:
Imag(double i = 0):Complex(0, i){}
Imag(const Complex &c) : Complex(0, c.im){}
Imag& operator = (const Complex &c)
{re = 0; im = c.im; return *this;}
double Norm() const {return fabs(im);}
};
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
18
};
void main()
{
Imag i = 1;
Complex z1(1,1), z3 = z1 - i; // z3 = (1,0)
i = Complex(5,2); // i la so ao (0,2)
Imag j = z1; // j la so ao (0,1)
cout << "z1 = " << z1 << "\n";
cout << "i = " << i << "\n";
cout << "j = " << j << "\n";
}
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
Trong v du tren lp so ao (Imag) ke tha hau het cac thao
tac cua lp so phc (Complex). Tuy nhien ta muon rang
buoc moi oi tng thuoc lp so ao eu phai co phan thc
bang 0. V vay phai nh ngha lai cac ham thanh phan co
the vi pham ieu nay. V du phep toan gan phai c nh
ngha lai e bao am rang buoc nay.
class Imag: public Complex
19
class Imag: public Complex
{
public:
//...
Imag(const Complex &c) : Complex(0, c.im){}
Imag& operator = (const Complex &c)
{re = 0; im = c.im; return *this;}
};
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
V du sau minh hoa them rang buoc ng ngha lp con
class HCN:public Hinh
{
friend class HV;
Diem TrenTrai;
double rong, cao;
public:
HCN(Diem tt, double r, double c);
20
HCN(Diem tt, double r, double c);
HCN(double ttx, double tty, double r, double c);
HCN():TrenTrai(4,6), rong(7), cao(4){}
double DienTich() const {return rong*cao;}
void Nhap() {cin >> TrenTrai >> rong >> cao;}
void Xuat();
void PhongTo(double tiLe);
void GianNgang(double tiLe);
void GianDoc(double tiLe);
};
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
void HCN::PhongTo(double tiLe)
{
rong *= tiLe;
cao *= tiLe;
}
void HCN::GianNgang(double tiLe)
{
TrenTrai.TinhTien(rong*(1-tiLe)/2, 0);
21
TrenTrai.TinhTien(rong*(1-tiLe)/2, 0);
rong *= tiLe;
}
void HCN::GianDoc(double tiLe)
{
TrenTrai.TinhTien(0, cao*(1-tiLe)/2);
cao *= tiLe;
}
void Nhap();
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
class HV:public HCN
{
public:
HV(Diem tt, double canh):HCN(tt, canh, canh){}
HV(double ttx, double tty, double
canh):HCN(ttx,tty,canh,canh){}
HV():HCN(7,8,6,6){}
char *TenLop() {return "Hinh Vuong";}
22
char *TenLop() {return "Hinh Vuong";}
void Nhap() {cin >> TrenTrai >> rong; cao = rong;}
void Xuat();
void GianNgang(double tiLe);
void GianDoc(double tiLe);
};
Rang buoc ngu nghia o Iop con Rang buoc ngu nghia o Iop con
void HV::GianNgang(double tiLe)
{
PhongTo(sqrt(tiLe));
}
void HV::GianDoc(double tiLe)
{
PhongTo(sqrt(tiLe));
23
PhongTo(sqrt(tiLe));
}
4 Pham vi truy xuat 4 Pham vi truy xuat
Khi thiet lap quan he ke tha, ta van phai quan tam en
tnh ong goi va che dau thong tin. ieu nay dan en van
e xac nh anh hng cua ke tha en pham vi truy xuat
cac thanh phan cua lp. Hai van e c at ra la:
Truy xuat theo chieu doc: Ham thanh phan cua lp con co
quyen truy xuat cac thanh phan rieng t cua lp cha hay
khong ? V chieu truy xuat la t lp con, chau len lp cha
24
khong ? V chieu truy xuat la t lp con, chau len lp cha
nen ta goi la truy xuat theo chieu doc
Truy xuat theo chieu ngang: Cac thanh phan cua lp cha,
sau khi ke tha xuong lp con, th the gii ben ngoai co
quyen truy xuat thong qua oi tng cua lp con hay
khong? Trong trng hp nay, ta goi la truy xuat theo
chieu ngang.
4.1 Truy xuat theo chieu doc 4.1 Truy xuat theo chieu doc
Lp con co quyen truy xuat cac thanh phan cua lp cha
hay khong, hay tong quat hn, ni nao co quyen truy xuat
cac thanh phan cua lp cha, hoan toan do lp cha quyet
nh. ieu o c xac nh bang thuoc tnh truy xuat .
Trong trng hp lp sinh vien ke tha t lp ngi, truy
xuat theo chieu doc co ngha lieu lp sinh vien co quyen
truy xuat cac thanh phan ho ten, nam sinh cua lp ngi
25
truy xuat cac thanh phan ho ten, nam sinh cua lp ngi
hay khong. Chnh xac hn mot oi tng sinh vien co
quyen truy xuat ho ten cua chnh mnh nhng c khai
bao lp ngi hay khong?
Thuoc tnh truy xuat la ac tnh cua mot thanh phan cua
lp cho biet nhng ni nao co quyen truy xuat thanh phan
o.
Thuoc tnh truy xuat Thuoc tnh truy xuat
Thuoc tnh public: Thanh phan nao co thuoc tnh public th
co the c truy xuat t bat c ni nao (t sau khai bao
lp).
Thuoc tnh private: Thanh phan nao co thuoc tnh private
th no la rieng t cua lp o. Ch co cac ham thanh phan
cua lp va ngoai le la cac ham ban c phep truy xuat,
ngay ca cac lp con cung khong co quyen truy xuat.
26
ngay ca cac lp con cung khong co quyen truy xuat.
Thuoc tnh truy xuat Thuoc tnh truy xuat
class Nguoi
{
char *HoTen;
int NamSinh;
public:
//...
};
class SinhVien : public Nguoi
27
class SinhVien : public Nguoi
{
char *MaSo;
public:
//...
void Xuat() const; // khong the truy xuat
}; // Nguoi::HoTen va Nguoi::NamSinh
Thuoc tnh private Thuoc tnh private
Trong v du tren, khong co ham thanh phan nao cua lp
SinhVien co the truy xuat cac thanh phan private HoTen,
NamSinh cua lp Nguoi. Noi cach khac, lp con khong co
quyen vi pham tnh ong goi cua lp cha. oan chng
trnh sau gay ra loi luc bien dch.
void SinhVien::Xuat() const
{
28
{
cout << "Sinh vien, ma so: " << MaSo << ", ho
ten: " << HoTen;
}
Ta co the khac phuc c loi tren nh khai bao lp
SinhVien la ban cua lp Nguoi, nh trong v du au
chng:
Thuoc tnh private Thuoc tnh private
class Nguoi
{
friend class SinhVien;
char *HoTen;
int NamSinh;
public:
//...
};
class SinhVien : public Nguoi
29
class SinhVien : public Nguoi
{
char *MaSo;
public:
//...
void Xuat() const { cout << "Sinh vien, ma so: "
<< MaSo << ", ho ten: " << HoTen; }
};
Thuoc tnh private Thuoc tnh private
Vi khai bao ham ban nh tren, lp sinh vien co the truy
xuat cac thanh phan cua lp ngi.
void SinhVien::Xuat() const
{
cout << "Sinh vien, ma so: " << MaSo << ", ho
ten: " << HoTen; // Ok: co quyen truy xuat
// Nguoi::HoTen, Nguoi::NamSinh
}
30
}
Cach lam tren giai quyet c nhu cau cua ngi s dung
khi muon tao lp con co quyen truy xuat cac thanh phan d
lieu private cua lp cha. Tuy nhien no oi hoi phai sa oi
lai lp cha va tat ca cac lp cap cao hn moi khi mot lp
con mi ra i.
Thuoc tnh private Thuoc tnh private
class Nguoi
{
friend class SinhVien;
friend class NuSinh;
char *HoTen;
int NamSinh;
public:
//...
31
//...
void An() const { cout << HoTen << " an 3 chen
com";}
};
class SinhVien : public Nguoi
{
friend class NuSinh;
char *MaSo;
public:
//...
};
Thuoc tnh private Thuoc tnh private
class NuSinh : public SinhVien
{
public:
NuSinh(char *ht, char *ms, int ns) :
SinhVien(ht,ms,ns) {}
void An() const { cout << HoTen << " ma so "
<< MaSo << " an 2 to pho";}
};
32
};
void main()
{
Nguoi p1("Le Van Nhan",1980);
SinhVien s1("Vo Vien Sinh", "200002541",1984);
NuSinh ns("Le Thi Ha Dong", "200002544",1984);
p1.An(); cout << "\n";
s1.An();cout << "\n";
ns.An();cout << "\n";
}
Thuoc tnh protected Thuoc tnh protected
Trong v du tren, khi lp NuSinh ra i ta phai thay oi lp
cha SinhVien va ca lp c s Nguoi mc cao hn.
Thuoc tnh protected: cho phep qui nh mot vai thanh
phan nao o cua lp la bao mat, theo ngha the gii ben
ngoai khong c phep truy xuat, nhng tat ca cac lp con,
chau eu c phep truy xuat
class Nguoi
33
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
//...
};
Thuoc tnh protected Thuoc tnh protected
class SinhVien : public Nguoi
{
protected:
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) :
Nguoi(ht,ns) { MaSo = strdup(ms);}
~SinhVien() {delete [] MaSo;}
34
~SinhVien() {delete [] MaSo;}
void Xuat() const; // Co the truy xuat
// Nguoi::HoTen va Nguoi::NamSinh
};
Thuoc tnh protected Thuoc tnh protected
class NuSinh : public SinhVien
{
public:
NuSinh(char *ht, char *ms, int ns) :
SinhVien(ht,ms,ns) {}
void An() const { cout << HoTen << " ma so "
<< MaSo << " an 2 to pho";}
}; // Co the truy xuat Nguoi::HoTen va
35
}; // Co the truy xuat Nguoi::HoTen va
// Nguoi::NamSinh va SinhVien::MaSo
Thuoc tnh protected Thuoc tnh protected
void Nguoi::Xuat() const
{
cout << "Nguoi, ho ten: " << HoTen << " sinh "
<< NamSinh;
}
void SinhVien::Xuat() const
{
36
{
cout << "Sinh vien, ma so: " << MaSo << ", ho
ten: " << HoTen; // Ok: co quyen truy xuat
// Nguoi::HoTen, Nguoi::NamSinh
}
Thuoc tnh protected Thuoc tnh protected
Thuoc tnh protected la phng tien e tranh phai sa oi
lp c s khi co lp con mi ra i. Nh o no bao c
tnh ong cua mot lp. Khai bao mot thanh phan nao co
thuoc tnh protected tng ng vi qui nh trc tat ca
cac lp con, chau sau nay eu la ban cua thanh phan o.
Thong thng ta dung thuoc tnh protected cho cac thanh
phan d lieu va thuoc tnh public cho ham thanh phan.
37
phan d lieu va thuoc tnh public cho ham thanh phan.
Cac thuoc tnh public, private, protected va khai bao friend
cho nhng ni nao co quyen truy xuat en cac thanh phan
cua lp. Cho hay khong cho ai truy xuat en (thanh phan
cua) lp hoan toan do lp quyet nh.
4.2 Truy xuat theo chieu ngang 4.2 Truy xuat theo chieu ngang
Thanh phan protected va public cua lp khi a ke tha
xuong lp con th the gii ben ngoai co quyen truy xuat
thong qua oi tng thuoc lp con hay khong? ieu nay
hoan toan do lp con quyet nh bang thuoc tnh ke tha.
Co hai thuoc tnh ke tha la ke tha public va ke tha
private.
Ke tha public: Lp con ke tha public t lp cha th cac
38
Ke tha public: Lp con ke tha public t lp cha th cac
thanh phan protected cua lp cha tr thanh protected cua
lp con, cac thanh phan public cua lp cha tr thanh public
cua lp con. Noi cach khac moi thao tac cua lp cha c
ke tha xuong lp con. V vay ta co the s dung thao tac
cua lp cha cho oi tng thuoc lp con.
Ta qui nh ke tha public bang t khoa public theo sau
dau hai cham khi thiet lap quan he ke tha.
Ke thua pubIic Ke thua pubIic
class SinhVien : public Nguoi
{
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) :
Nguoi(ht,ns) { MaSo = strdup(ms);}
~SinhVien() {delete [] MaSo;}
void Xuat() const;
39
void Xuat() const;
};
Khai bao nh tren cho biet moi thao tac (public) cua lp
ngi eu ap c cho moi oi tng sinh vien.
//...
SinhVien s1("Vo Vien Sinh", "200002541",1984);
s1.An();cout << "\n";
s1.Xuat(); cout << "\n";
s1.Nguoi::Xuat(); cout << "\n";
//...
Ke thua pubIic Ke thua pubIic
Do c tha hng cac ac tnh cua lp cha nen ta dung
ke tha public khi va ch khi co quan he la mot t lp con
en lp cha.
Hau het cac trng hp ke tha la ke tha public, no cho
phep tan dung lai ma chng trnh, ong thi tao kha nang
thu gom cac ac iem chung cua cac lp vao mot lp c
s, nh o de dang nang cap va sa cha (bao tr).
40
s, nh o de dang nang cap va sa cha (bao tr).
Ke thua private Ke thua private
Co nhng trng hp cac lp khong co quan he vi nhau
ve mat ng ngha nhng chia se chung chi tiet cai at, neu
dung ke tha public th sai khai niem v lp con se tha
hng cac thao tac no khong co t lp cha.
Ke tha private: Lp con ke tha private t lp cha th cac
thanh phan protected va public cua lp cha tr thanh
private cua lp con. Noi cach khac moi thao tac cua lp
41
private cua lp con. Noi cach khac moi thao tac cua lp
cha eu b lp con che dau. V vay tren quan iem cua the
gii ben ngoai lp con khong co cac thao tac ma lp cha
co.
S dung ke tha private. Ta co the chia se ma chng trnh
gia cac lp co cau truc d lieu tng t nhau nhng van
gi c tinh than cua tng lp.
Ke thua private Ke thua private
V du sau minh hoa ke tha private: Lp List bieu dien
khai niem danh sach lien ket, lp Stack bieu dien , lp Set
bieu dien khai niem tap hp. Neu to chc Stack, Set nh
danh sach lien ket, co the dung ke tha private e tan
dung ma chng trnh chung.
typedef int Item;
typedef int bool;
42
typedef int bool;
const bool true = 1, false = 0;
class Link
{
friend class List;
friend class ListIterator;
Link *next;
Item e;
Link(Item a, Link *p):e(a) {next = p;}
};
Ke thua private Ke thua private
class List
{
friend class ListIterator;
Link *last;
public:
List() {last = NULL;}
~List() { CleanUp(); }
void Insert(Item a); // add at head of list
43
void Insert(Item a); // add at head of list
void Append(Item a); // add at tail of list
void GetFirst(Item *px); // return and remove head
void CleanUp();
bool Empty() const {return last == NULL;}
bool IsMember(Item x) const;
int Count() const;
void View() const;
};
Ke thua private Ke thua private
class Stack:private List
{
public:
Stack():List() {}
bool Empty() const {return List::Empty();}
bool Push(Item x) {Insert(x); return true;}
bool Pop(Item *px);
};
44
};
inline bool Stack::Pop(Item *px)
{
if (Empty()) return false;
GetFirst(px);
return true;
}
Ke thua private Ke thua private
class Set:private List
{
public:
Set():List(){}
void Add(Item x) {if (!List::IsMember(x))
Insert(x);}
bool Empty() const {return List::Empty();}
bool IsMember(Item x) const {return
45
bool IsMember(Item x) const {return
List::IsMember(x);}
int Count() const {return List::Count();}
void View() const {List::View();}
};
Cac lp Stack va Set tan dung c cau truc d lieu va chi
tiet cai at cua lp List, nhng khong b tr thanh List v s
dung ke tha private. Cac thao tac cua List khong b ke
tha xuong lp con Stack va Set.
Ke thua private Ke thua private
Mot so ham thanh phan cua lp c s List co the can thiet
lp con nh ham Empty trong lp Stack, ham Empty,
IsMember, Count trong lp Set Ta nh ngha lai nhng
ham nay bang cach goi lai phien ban trong lp List.
Mot cach thay the viec viet lai ham nh tren la khai bao
lai cac danh hieu nay trong phan public cua lp con.
class Stack:private List
46
class Stack:private List
{
public:
Stack():List() {}
bool Push(Item x) {Insert(x); return true;}
bool Pop(Item *px);
List::Empty; // access specifier
};
Ke thua private Ke thua private
Ta co the lam tng t cho lp Set.
class Set:private List
{
public:
Set():List(){}
void Add(Item x) {if (!List::IsMember(x))
Insert(x);}
List::Empty; // access specifier
47
List::Empty; // access specifier
List::IsMember;
List::Count;
List::View;
};
Ta dung ke tha private trong cac trng hp muon tan
dung ma chng trnh chung va co the muon ke tha mot
phan nhng khong phai tat ca cac thao tac cua lp c s.
Ke thua private Ke thua private
class Diem
{
double x,y;
public:
Diem(double xx = 0, double yy = 0):x(xx),y(yy){}
void TinhTien(double dx, double dy);
friend Diem operator + (Diem d);
friend Diem operator - (Diem d);
//...
48
//...
};
class HinhTron:Diem
{
double r;
public:
HinhTron(double tx, double ty, double
rr):Diem(tx,ty),r(rr){}
void Ve(int color) const;
void TinhTien(double dx, double dy) const;
};
Dung Iai ma khong can ke thua Dung Iai ma khong can ke thua
Ta luon luon co the tan dung ma chng trnh chung bang
ke tha private nh tren, nhng cung co the khong can
dung ke tha.
class Link
{
friend class List;
friend class ListIterator;
Link *next;
49
Link *next;
Item e;
Link(Item a, Link *p):e(a) {next = p;}
};
Dung Iai ma khong can ke thua Dung Iai ma khong can ke thua
class List
{
friend class ListIterator;
Link *last;
public:
void Insert(Item a);
Append(Item a); // add at tail of list
bool GetFirst(Item *);
50
bool GetFirst(Item *);
void CleanUp();
List() {last = NULL;}
List(Item a);
~List() { CleanUp(); }
bool Empty() const {return last == NULL;}
bool IsMember(Item x) const;
int Count() const;
void View() const;
};
Dung Iai ma khong can ke thua Dung Iai ma khong can ke thua
class Stack
{
List l;
public:
Stack():l() {}
bool Push(Item x) {l.Insert(x); return true;}
bool Pop(Item *px);
bool Empty() const {return l.Empty();}
51
bool Empty() const {return l.Empty();}
};
inline bool Stack::Pop(Item *px)
{
if (l.Empty()) return false;
l.GetFirst(px);
return true;
}
Dung Iai ma khong can ke thua Dung Iai ma khong can ke thua
class Set
{
List l;
public:
Set():l(){}
void Add(Item x) {if (!l.IsMember(x))
l.Insert(x);}
bool Empty() const {return l.Empty();}
bool IsMember(Item x) const {return
52
bool IsMember(Item x) const {return
l.IsMember(x);}
int Count() const {return l.Count();}
void View() const {l.View();}
};
Dung Iai ma khong can ke thua Dung Iai ma khong can ke thua
class HinhTron
{
double r;
Diem tam;
public:
HinhTron(double tx, double ty, double
rr):tam(tx,ty),r(rr){}
void Ve(int color) const;
53
void Ve(int color) const;
void TinhTien(double dx, double dy) const;
};
4. Thiet Iap va huy bo 4. Thiet Iap va huy bo
Phng thc thiet lap va huy bo la cac ham thanh phan
ac biet dung e t ong khi ong oi tng khi no c
tao ra va t ong don dep oi tng khi no b huy i.
Mot oi tng thuoc lp con co cha cac thanh phan d
lieu cua cac lp c s. Co the xem lp con co cac thanh
phan ngam nh ng vi cac lp c s. V vay khi mot o
tng thuoc lp con c tao ra, cac thanh phan c s cung
54
tng thuoc lp con c tao ra, cac thanh phan c s cung
c tao ra, ngha la phng thc thiet lap cua cac lp c
s phai c goi.
Trnh bien dch t ong goi phng thc thiet lap cua cac
lp c s cho cac oi tng (c s) nhung vao oi tng
ang c tao ra.
oi vi phng thc thiet lap cua mot lp con, cong viec
au tien la goi phng thc thiet lap cua cac lp c s.
Phuong thuc thiet Iap va huy bo Phuong thuc thiet Iap va huy bo
Neu moi phng thc thiet lap cua lp c s eu oi hoi
phai cung cap tham so th lp con bat buoc phai co phng
thc thiet lap e cung cap cac tham so o.
class Diem
{
double x,y;
public:
Diem(double x, double y):x(xx),y(yy){}
55
Diem(double x, double y):x(xx),y(yy){}
//...
};
class HinhTron:Diem
{
double r;
public:
void Ve(int color) const;
};
HinhTron t; // SAI
Cung cap tham so thiet Iap Cung cap tham so thiet Iap
Trong trng hp o, lp con bat buoc phai co phng thc
thiet lap e cung cap tham so cho phng thc thiet lap
cua lp c s.
Cu phap e goi phng thc thiet lap cua lp c s tng
t nh cu phap thiet lap oi tng thanh phan, ban than ten
lp c s c quan iem nh oi tng thanh phan nhung
vao lp con.
56
vao lp con.
Cung cap tham so thiet Iap Cung cap tham so thiet Iap
class HinhTron:Diem
{
double r;
public:
HinhTron(double tx, double ty, double
rr):Diem(tx,ty),r(rr){}
void Ve(int color) const;
void TinhTien(double dx, double dy) const;
57
void TinhTien(double dx, double dy) const;
};
HinhTron t(200,200,50); // Dung
Cung cap tham so thiet Iap Cung cap tham so thiet Iap
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {HoTen =
strdup(ht);}
//...
58
//...
};
class SinhVien : public Nguoi
{
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) :
Nguoi(ht,ns) { MaSo = strdup(ms);}
void Xuat() const;
};
Phuong thuc thiet Iap va huy bo Phuong thuc thiet Iap va huy bo
Sau khi phng thc thiet lap cua cac lp c s c goi,
ma chng trnh trong ban than phng thc cua lp con se
c thc hien. Noi dung cua phng thc thiet lap lp
con ch nen thao tac tren d lieu cua rieng lp con, viec
khi ong d lieu thuoc lp cha do phng thc thiet lap
lp cha am nhiem vi cac tham so cung cap bi lp con.
class SinhVien : public Nguoi
59
class SinhVien : public Nguoi
{
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) :
Nguoi(ht,ns) { MaSo = strdup(ms); }
void Xuat() const;
};

You might also like