You are on page 1of 23

4. Phuong thuc ao va tnh a 4.

Phuong thuc ao va tnh a


hnh hnh
1
hnh hnh
Noi dung Noi dung
1 1 Bai toan quan ly mot danh Bai toan quan ly mot danh
sach cac oi tng khac kieu sach cac oi tng khac kieu
3 3 Phng thc ao Phng thc ao
4 4 Phng thc ao thuan tuy Phng thc ao thuan tuy
2
4 4 Phng thc ao thuan tuy Phng thc ao thuan tuy
1 B.toan q.Iy cac .tuong khac kieu 1 B.toan q.Iy cac .tuong khac kieu
- Gia s ta can quan ly mot danh sach cac oi tng co kieu
co the khac nhau, ta can giai quyet hai van e: Cach lu
tr va thao tac x ly.
- Xet trng hp cu the, cac oi tng co the la ngi, sinh
vien hoac cong nhan.
- Ve lu tr: Ta co the dung union, trong trng hp nay moi
oi tng phai co kch thc cha c oi tng co kch
3
- Ve lu tr: Ta co the dung union, trong trng hp nay moi
oi tng phai co kch thc cha c oi tng co kch
thc ln nhat. ieu nay gay lang ph khong gian lu tr.
Mot cach thay the la lu tr oi tng bang ung kch
thc cua no va dung mot danh sach (mang, dslk,...) cac
con tro e quan ly cac oi tng.
- Ve thao tac, phai thoa yeu cau a hnh: Thao tac co hoat
ong khac nhau ng vi cac loai oi tng khac nhau. Co
hai cach giai quyet la vung chon kieu va phng thc ao.
Dung vung chon kieu Dung vung chon kieu
Ve lu tr: Ta se dung mot mang cac con tro en lp c s
e co the tro en cac oi tng thuoc lp con.
Xet lp Ngi va cac lp ke tha sinh vien va cong nhan.
Thao tac ta quan tam la xuat. Ta can bao am thao tac xuat
ap dung cho lp sinh vien va lp cong nhan khac nhau.
4
V du minh hoa V du minh hoa
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {HoTen =
strdup(ht);}
5
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 { cout << "Nguoi, ho ten: "
<< HoTen << " sinh " << NamSinh; }
};
V du minh hoa V du minh hoa
class SinhVien : public Nguoi
{
protected:
char *MaSo;
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
~SinhVien() {delete [] MaSo;}
6
~SinhVien() {delete [] MaSo;}
void Xuat() const { cout << "Sinh vien " <<
HoTen << ", ma so " << MaSo;}
};
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";}
};
V du minh hoa V du minh hoa
class CongNhan : public Nguoi
{
protected:
double MucLuong;
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
void Xuat() const { cout << "Cong nhan, ten "
7
void Xuat() const { cout << "Cong nhan, ten "
<< HoTen << " muc luong: " << MucLuong;}
};
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
an[i]->Xuat();
cout << "\n";
}
}
V du minh hoa V du minh hoa
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", 200001234",
1982);
a[1] = new NuSinh("Le Thi Ha Dong", 200001235",
1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000,
8
a[2] = new CongNhan("Tran Nhan Cong", 1000000,
1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
Dung vung chon kieu Dung vung chon kieu
Xuat lieu cho oan chng trnh tren nh sau:
Nguoi, ho ten: Vien Van Sinh sinh 1982
Nguoi, ho ten: Le Thi Ha Dong sinh 1984
Nguoi, ho ten: Tran Nhan Cong sinh 1984
Nguoi, ho ten: Nguyen Thanh Nhan sinh 1960
Tat ca moi oi tng eu c quan iem nh ngi v
thao tac c thc hien thong qua con tro en lp Ngi.
9
thao tac c thc hien thong qua con tro en lp Ngi.
e bao am xuat lieu tng ng vi oi tng, phai co
cach nhan dien oi tng, ta them mot vung d lieu vao
lp c s e nhan dien, vung nay co gia tr phu thuoc vao
loai cua oi tng va c goi la vung chon kieu.
Mot cach tiep can khac la dung phng thc ao.
2. Phuong thuc ao 2. Phuong thuc ao
Con tro thuoc lp c s co the tro en lp con:
Nguoi* pn = new SinhVien(Le Vien Sinh,
200001234, 1982);
Ta mong muon thong qua con tro thuoc lp c s co the
truy xuat ham thanh phan c nh ngha lai lp con:
pn->Xuat(); // Mong muon: goi Xuat cua lop sinh
// vien, thuc te: goi Xuat cua lop
10
// Nguoi
Phng thc ao cho phep giai quyet van e. Ta qui nh
mot ham thanh phan la phng thc ao bang cach them t
khoa virtual vao trc khai bao ham.
Trong v du tren, ta them t khoa virtual vao trc khai
bao cua ham xuat.
Phuong thuc ao Phuong thuc ao
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {HoTen =
strdup(ht);}
11
strdup(ht);}
~Nguoi() {delete [] HoTen;}
void An() const { cout << HoTen << " an 3 chen
com";}
void Ngu() const { cout << HoTen << " ngu ngay
8 tieng";}
virtual void Xuat() const { cout << "Nguoi, ho
ten: " << HoTen << " sinh " << NamSinh; }
};
Phuong thuc ao Phuong thuc ao
class SinhVien : public Nguoi
{
protected:
char *MaSo;
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
~SinhVien() {delete [] MaSo;}
12
~SinhVien() {delete [] MaSo;}
void Xuat() const { cout << "Sinh vien " <<
HoTen << ", ma so " << MaSo;}
};
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";}
};
Phuong thuc ao Phuong thuc ao
class CongNhan : public Nguoi
{
protected:
double MucLuong;
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
void Xuat() const { cout << "Cong nhan, ten "
13
void Xuat() const { cout << "Cong nhan, ten "
<< HoTen << " muc luong: " << MucLuong;}
};
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
an[i]->Xuat();
cout << "\n";
}
}
Phuong thuc ao Phuong thuc ao
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
"200001234", 1982);
a[1] = new NuSinh("Le Thi Ha Dong",
"200001235", 1984);
14
"200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000,
1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
Phng thc ao xuat c khai bao lp Nguoi cho phep
s dung con tro en lp c s (Nguoi) nhng tro en mot
oi tng thuoc lp con (Sinh vien, cong nhan) goi ung
thao tac lp con:
Phuong thuc ao Phuong thuc ao
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh", "200001234",
1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
Con tro pn thuoc lp Nguoi nhng tro en oi tng sinh
vien, v vay pn->Xuat() thc hien thao tac xuat cua lp sinh
vien.
Tr lai v du tren, khi i a[i] lan lt tro en cac oi tng
15
Tr lai v du tren, khi i a[i] lan lt tro en cac oi tng
thuoc cac loai khac nhau, thao tac tng ng vi lp se c
goi.
Dung phng thc ao khac phuc c cac nhc iem cua
cach tiep can dung vung chon kieu:
Thao tac n gian khong phai dung switch/case v vay kho
sai, de sa.
Them Iop con moi Them Iop con moi
Dung phng thc ao, ta de dang nang cap sa cha. Viec
them mot loai oi tng mi rat n gian, ta khong can
phai sa oi thao tac x ly (ham XuatDs). Qui trnh them
ch la xay dng lp con ke tha t lp c s hoac cac lp
con a co va nh ngha lai phng thc (ao) lp mi tao
neu can
class CaSi : public Nguoi
16
class CaSi : public Nguoi
{
protected:
double CatXe;
public:
CaSi(char *ht, double cx, int ns) :
Nguoi(ht,ns), CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen
<< " co cat xe " << CatXe;}
};
Them Iop con moi Them Iop con moi
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
an[i]->Xuat();
cout << "\n";
}
}
17
}
Ham XuatDs khong thay oi, nhng no co the hoat ong
cho cac loai oi tng ca s thuoc lp mi ra i.
Co the xem nh thao tac XuatDs c viet trc cho cac
lp con chau cha ra i.
Cac Iuu y khi su dung phuong thuc ao Cac Iuu y khi su dung phuong thuc ao
Phng thc ao ch hoat ong thong qua con tro.
Muon mot ham tr thanh phng thc ao co hai cach: Khai
bao vi t khoa virtual hoac ham tng ng lp c s a
la phng thc ao.
Phng thc ao ch hoat ong neu cac ham lp c s va
lp con co nghi thc giao tiep giong het nhau.
Neu lp con nh ngha lai phng thc ao th se goi
18
Neu lp con nh ngha lai phng thc ao th se goi
phng thc lp c s (gan nhat co nh ngha).
Phuong thuc huy bo ao Phuong thuc huy bo ao
Trong v du quan ly danh sach cac oi tng thuoc cac lp
Nguoi, SinhVien, CongNhan, Thao tac don dep oi tng
la can thiet.
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
19
a[0] = new SinhVien("Vien Van Sinh",
"20001234", 1982);
a[1] = new NuSinh("Le Thi Ha Dong",
"20001235", 1984);
a[2] = new CongNhan("Tran Nan Cong", 1000000,
1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
for (int i = 0; i < 4; i++)
delete a[i];
}
Phuong thuc huy bo ao Phuong thuc huy bo ao
Thong qua con tro thuoc lp c s Nguoi, ch co phng
thc huy bo cua lp Nguoi c goi.
e bao am viec don dep la ay u, ta dung phng thc
huy bo ao.
class Nguoi
{
protected:
20
protected:
char *HoTen;
int NamSinh;
public:
Nguoi(char *ht, int ns):NamSinh(ns) {HoTen =
strdup(ht);}
virtual ~Nguoi() {delete [] HoTen;}
virtual void Xuat(ostream &os) const { os <<
"Nguoi, ho ten: " << HoTen << " sinh " <<
NamSinh; }
void Xuat() const { Xuat(cout); }
};
3. PT ao th tuy va Iop cso tr tuong 3. PT ao th tuy va Iop cso tr tuong
Lp c s tru tng la lp c s khong co oi tng nao
thuoc chnh no. Mot oi tng thuoc lp c s tru tng
phai thuoc mot trong cac lp con.
Xem chng trnh nguon t_hinh.cpp
21
Khi lp co phng thc ao thuan tuy, lp tr thanh lp c
s tru tng. Ta khong the tao oi tng thuoc lp c s
thuan tuy.
Ta co the nh ngha phng thc ao thuan tuy, nhng ch
co cac oi tng thuoc lp con co the goi no.
Phng thc ao thuan tuy co y ngha cho viec to chc s o
phan cap cac lp, no ong vai tro cha san cho trong cho
Phuong thuc ao thuan tuy va Iop co so truu tuong Phuong thuc ao thuan tuy va Iop co so truu tuong
22
phan cap cac lp, no ong vai tro cha san cho trong cho
cac lp con ien vao vi phien ban phu hp.
Phuong thuc ao thuan tuy va Iop co so truu tuong Phuong thuc ao thuan tuy va Iop co so truu tuong
Ban than cac lp con cua lp c s tru tng cung co the
la lp c s tru tng.
23

You might also like