i dung NN(cid:1245)(cid:1245)i dung
1. (cid:49)(cid:1237)i k(cid:1219)t t(cid:429)nh (Static binding) 2. (cid:49)(cid:1237)i k(cid:1219)t (cid:255)(cid:1245)ng (Dynamic binding) 3. Ch(cid:1189)y ch(cid:1133)(cid:1131)ng trình 4. Bài toán th(cid:1269)c t(cid:1219) 5. Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, (cid:255)a hình 6. Ph(cid:1133)(cid:1131)ng th(cid:1261)c h(cid:1259)y b(cid:1235) (cid:1191)o 7. Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o, l(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng
P TRÌNH LL(cid:1200)(cid:1200)P TRÌNH (cid:43)(cid:1132)(cid:43)(cid:1132)(cid:1246)(cid:1246)NG (cid:264)NG (cid:264)(cid:1236)(cid:1236)I T(cid:1132)I T(cid:1132)(cid:1254)(cid:1254)NGNG VIRTUAL METHOD VIRTUAL METHOD & POLYMORPHISM & POLYMORPHISM Tr(cid:1195)n Ph(cid:1133)(cid:1247)c Tu(cid:1193)n tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com
TPTU(cid:1192)N - LTH(cid:264)T 2 9/6/2009
binding 1. Static binding 1. Static
binding 2. Dynamic binding 2. Dynamic
class Circle { int x,y,r; public:
class Circle { int x,y,r; public:
Circle (int xx, int yy, int rr)
{ x=xx; y=yy; r=rr;
}
void print()
{ cout <
Circle (int xx, int yy, int rr)
{ x=xx; y=yy; r=rr;
}
void print()
{ cout <
};
void main()
{ Circle c(3,4,5);
};
void main()
{ Circle *pc;
c.print();
}
pc= new Circle(3,4,5);
pc->print();
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 3 4 9/6/2009 9/6/2009
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr
3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr
3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
Polymorphism ability occurs
only when you use a pointer
to an object and
used-methods of classes
are virtual methods
virtual ReturnType
or
ReturnType virtual
are accepted
Perhaps, you want
to see “Son”
on the screen.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 6 5 9/6/2009 9/6/2009
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
Nguoi
(cid:132) Gi(cid:1191) (cid:86)(cid:1265) ta c(cid:1195)n qu(cid:1191)n lý m(cid:1245)t danh sách các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng có ki(cid:1223)u có th(cid:1223) khác nhau, ta c(cid:1195)n
gi(cid:1191)i quy(cid:1219)t hai v(cid:1193)n (cid:255)(cid:1221)
(cid:133) Cách l(cid:1133)u tr(cid:1267)
(cid:133) Thao tác x(cid:1265) lý
(cid:132) Xét tr(cid:1133)(cid:1249)ng h(cid:1255)p c(cid:1257) th(cid:1223), các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
CongNhan
SinhVien
(cid:133) Ng(cid:1133)(cid:1249)i
(cid:133) Sinh viên
(cid:133) Công nhân
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 8 7 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(char *ht, int ns):NamSinh(ns)
Nguoi(n,ns) { MaSo = strdup(ms);}
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
void Xuat() const
{
~Nguoi() {delete [] HoTen;}
void Xuat() const
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 10 9 9/6/2009 9/6/2009
class CongNhan : public Nguoi
{
protected:
double MucLuong;
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
for (int i = 0; i < n; i++)
{
Nguoi(n,ns), MucLuong(ml) { }
an[i]->Xuat();
cout << endl;
void Xuat() const
{
}
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
};
const int N = 4;
void main(){……..}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 12 11 9/6/2009 9/6/2009
(cid:132) (cid:46)(cid:1219)t qu(cid:1191) xu(cid:1193)t ra màn hình c(cid:1259)a ch(cid:1133)(cid:1131)ng trình
void main()
{
Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984
Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984
”200001234", 1982);
a[1] = new SinhVien("Le Thi Ha
Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960
(cid:132) (cid:55)(cid:1193)t c(cid:1191) (cid:80)(cid:1233)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1221)u (cid:255)(cid:1133)(cid:1255)c quan (cid:255)(cid:76)(cid:1223)m nh(cid:1133)
Dong",”200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong",
1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan",
ng(cid:1133)(cid:1249)i vì thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con
1960);
XuatDs(4,a);
tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p Ng(cid:1133)(cid:1249)i.
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 14 13 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o cho phép gi(cid:1191)i quy(cid:1219)t v(cid:1193)n
(cid:132) Con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p con:
Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);
(cid:255)(cid:1221). Ta qui (cid:255)(cid:1231)nh m(cid:1245)t hàm thành ph(cid:1195)n là
ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o b(cid:1205)ng cách thêm t(cid:1263) khoá
virtual vào tr(cid:1133)(cid:1247)c khai báo hàm.
virtual
(cid:132) Ta mong mu(cid:1237)n thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
có th(cid:1223) truy xu(cid:1193)t hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1231)nh ngh(cid:429)a
(cid:79)(cid:1189)i (cid:1251) (cid:79)(cid:1247)p con:
pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien,
(cid:132) Trong ví d(cid:1257) trên, ta thêm t(cid:1263) khoá virtual
// thuc te: goi Xuat cua lop Nguoi
vào tr(cid:1133)(cid:1247)c khai báo c(cid:1259)a hàm xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 15 16 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
Nguoi(char *ht, int ns):NamSinh(ns)
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
virtual void Xuat() const
virtual
{
~Nguoi() {delete [] HoTen;}
virtual void Xuat() const
virtual
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi
{
protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++)
{
virtual void Xuat() const
virtual
{
an[i]->Xuat();
cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
Circle (int xx, int yy, int rr)
{ x=xx; y=yy; r=rr;
}
void print()
{ cout <
};
void main()
{ Circle c(3,4,5);
};
void main()
{ Circle *pc;
c.print();
}
pc= new Circle(3,4,5);
pc->print();
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 3 4 9/6/2009 9/6/2009
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr
3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr
3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
Polymorphism ability occurs
only when you use a pointer
to an object and
used-methods of classes
are virtual methods
virtual ReturnType
or
ReturnType virtual
are accepted
Perhaps, you want
to see “Son”
on the screen.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 6 5 9/6/2009 9/6/2009
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
Nguoi
(cid:132) Gi(cid:1191) (cid:86)(cid:1265) ta c(cid:1195)n qu(cid:1191)n lý m(cid:1245)t danh sách các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng có ki(cid:1223)u có th(cid:1223) khác nhau, ta c(cid:1195)n
gi(cid:1191)i quy(cid:1219)t hai v(cid:1193)n (cid:255)(cid:1221)
(cid:133) Cách l(cid:1133)u tr(cid:1267)
(cid:133) Thao tác x(cid:1265) lý
(cid:132) Xét tr(cid:1133)(cid:1249)ng h(cid:1255)p c(cid:1257) th(cid:1223), các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
CongNhan
SinhVien
(cid:133) Ng(cid:1133)(cid:1249)i
(cid:133) Sinh viên
(cid:133) Công nhân
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 8 7 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(char *ht, int ns):NamSinh(ns)
Nguoi(n,ns) { MaSo = strdup(ms);}
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
void Xuat() const
{
~Nguoi() {delete [] HoTen;}
void Xuat() const
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 10 9 9/6/2009 9/6/2009
class CongNhan : public Nguoi
{
protected:
double MucLuong;
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
for (int i = 0; i < n; i++)
{
Nguoi(n,ns), MucLuong(ml) { }
an[i]->Xuat();
cout << endl;
void Xuat() const
{
}
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
};
const int N = 4;
void main(){……..}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 12 11 9/6/2009 9/6/2009
(cid:132) (cid:46)(cid:1219)t qu(cid:1191) xu(cid:1193)t ra màn hình c(cid:1259)a ch(cid:1133)(cid:1131)ng trình
void main()
{
Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984
Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984
”200001234", 1982);
a[1] = new SinhVien("Le Thi Ha
Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960
(cid:132) (cid:55)(cid:1193)t c(cid:1191) (cid:80)(cid:1233)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1221)u (cid:255)(cid:1133)(cid:1255)c quan (cid:255)(cid:76)(cid:1223)m nh(cid:1133)
Dong",”200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong",
1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan",
ng(cid:1133)(cid:1249)i vì thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con
1960);
XuatDs(4,a);
tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p Ng(cid:1133)(cid:1249)i.
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 14 13 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o cho phép gi(cid:1191)i quy(cid:1219)t v(cid:1193)n
(cid:132) Con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p con:
Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);
(cid:255)(cid:1221). Ta qui (cid:255)(cid:1231)nh m(cid:1245)t hàm thành ph(cid:1195)n là
ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o b(cid:1205)ng cách thêm t(cid:1263) khoá
virtual vào tr(cid:1133)(cid:1247)c khai báo hàm.
virtual
(cid:132) Ta mong mu(cid:1237)n thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
có th(cid:1223) truy xu(cid:1193)t hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1231)nh ngh(cid:429)a
(cid:79)(cid:1189)i (cid:1251) (cid:79)(cid:1247)p con:
pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien,
(cid:132) Trong ví d(cid:1257) trên, ta thêm t(cid:1263) khoá virtual
// thuc te: goi Xuat cua lop Nguoi
vào tr(cid:1133)(cid:1247)c khai báo c(cid:1259)a hàm xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 15 16 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
Nguoi(char *ht, int ns):NamSinh(ns)
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
virtual void Xuat() const
virtual
{
~Nguoi() {delete [] HoTen;}
virtual void Xuat() const
virtual
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi
{
protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++)
{
virtual void Xuat() const
virtual
{
an[i]->Xuat();
cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
}; void main() { Circle c(3,4,5);
}; void main() { Circle *pc;
c.print();
}
pc= new Circle(3,4,5); pc->print();
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 3 4 9/6/2009 9/6/2009
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr 3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
3. Ch(cid:1189)(cid:1189)y ch(cid:1133)(cid:1131)ng tr 3. Ch
y ch(cid:1133)(cid:1131)ng trììnhnh
Polymorphism ability occurs only when you use a pointer to an object and used-methods of classes are virtual methods
virtual ReturnType or ReturnType virtual are accepted
Perhaps, you want to see “Son” on the screen.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 6 5 9/6/2009 9/6/2009
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
Nguoi
(cid:132) Gi(cid:1191) (cid:86)(cid:1265) ta c(cid:1195)n qu(cid:1191)n lý m(cid:1245)t danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng có ki(cid:1223)u có th(cid:1223) khác nhau, ta c(cid:1195)n gi(cid:1191)i quy(cid:1219)t hai v(cid:1193)n (cid:255)(cid:1221) (cid:133) Cách l(cid:1133)u tr(cid:1267) (cid:133) Thao tác x(cid:1265) lý
(cid:132) Xét tr(cid:1133)(cid:1249)ng h(cid:1255)p c(cid:1257) th(cid:1223), các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
CongNhan
SinhVien
(cid:133) Ng(cid:1133)(cid:1249)i (cid:133) Sinh viên (cid:133) Công nhân
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 8 7 9/6/2009 9/6/2009
class Nguoi { protected:
class SinhVien : public Nguoi { protected:
char *MaSo;
char *HoTen; int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(char *ht, int ns):NamSinh(ns)
Nguoi(n,ns) { MaSo = strdup(ms);}
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;} void Xuat() const {
~Nguoi() {delete [] HoTen;} void Xuat() const {
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 10 9 9/6/2009 9/6/2009
class CongNhan : public Nguoi
{
protected:
double MucLuong;
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219)
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
for (int i = 0; i < n; i++)
{
Nguoi(n,ns), MucLuong(ml) { }
an[i]->Xuat();
cout << endl;
void Xuat() const
{
}
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
};
const int N = 4;
void main(){……..}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 12 11 9/6/2009 9/6/2009
(cid:132) (cid:46)(cid:1219)t qu(cid:1191) xu(cid:1193)t ra màn hình c(cid:1259)a ch(cid:1133)(cid:1131)ng trình
void main()
{
Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984
Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984
”200001234", 1982);
a[1] = new SinhVien("Le Thi Ha
Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960
(cid:132) (cid:55)(cid:1193)t c(cid:1191) (cid:80)(cid:1233)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1221)u (cid:255)(cid:1133)(cid:1255)c quan (cid:255)(cid:76)(cid:1223)m nh(cid:1133)
Dong",”200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong",
1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan",
ng(cid:1133)(cid:1249)i vì thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con
1960);
XuatDs(4,a);
tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p Ng(cid:1133)(cid:1249)i.
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 14 13 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o cho phép gi(cid:1191)i quy(cid:1219)t v(cid:1193)n
(cid:132) Con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p con:
Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);
(cid:255)(cid:1221). Ta qui (cid:255)(cid:1231)nh m(cid:1245)t hàm thành ph(cid:1195)n là
ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o b(cid:1205)ng cách thêm t(cid:1263) khoá
virtual vào tr(cid:1133)(cid:1247)c khai báo hàm.
virtual
(cid:132) Ta mong mu(cid:1237)n thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
có th(cid:1223) truy xu(cid:1193)t hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1231)nh ngh(cid:429)a
(cid:79)(cid:1189)i (cid:1251) (cid:79)(cid:1247)p con:
pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien,
(cid:132) Trong ví d(cid:1257) trên, ta thêm t(cid:1263) khoá virtual
// thuc te: goi Xuat cua lop Nguoi
vào tr(cid:1133)(cid:1247)c khai báo c(cid:1259)a hàm xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 15 16 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
Nguoi(char *ht, int ns):NamSinh(ns)
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
virtual void Xuat() const
virtual
{
~Nguoi() {delete [] HoTen;}
virtual void Xuat() const
virtual
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi
{
protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++)
{
virtual void Xuat() const
virtual
{
an[i]->Xuat();
cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
cout << "Nguoi, Ho ten: " << HoTen << “, Nam Sinh: " << NamSinh;
}
};
} };
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 10 9 9/6/2009 9/6/2009
class CongNhan : public Nguoi { protected:
double MucLuong;
4. B4. Bàài toi toáán thn th(cid:1269)(cid:1269)c tc t(cid:1219)(cid:1219) void XuatDs(int n, Nguoi *an[]) {
public:
CongNhan(char *n, double ml, int ns) :
for (int i = 0; i < n; i++) {
Nguoi(n,ns), MucLuong(ml) { }
an[i]->Xuat(); cout << endl;
void Xuat() const {
}
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
};
const int N = 4;
void main(){……..}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 12 11 9/6/2009 9/6/2009
(cid:132) (cid:46)(cid:1219)t qu(cid:1191) xu(cid:1193)t ra màn hình c(cid:1259)a ch(cid:1133)(cid:1131)ng trình
void main()
{
Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh",
Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984
Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984
”200001234", 1982);
a[1] = new SinhVien("Le Thi Ha
Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960
(cid:132) (cid:55)(cid:1193)t c(cid:1191) (cid:80)(cid:1233)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1221)u (cid:255)(cid:1133)(cid:1255)c quan (cid:255)(cid:76)(cid:1223)m nh(cid:1133)
Dong",”200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong",
1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan",
ng(cid:1133)(cid:1249)i vì thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con
1960);
XuatDs(4,a);
tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p Ng(cid:1133)(cid:1249)i.
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 14 13 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o cho phép gi(cid:1191)i quy(cid:1219)t v(cid:1193)n
(cid:132) Con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p con:
Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);
(cid:255)(cid:1221). Ta qui (cid:255)(cid:1231)nh m(cid:1245)t hàm thành ph(cid:1195)n là
ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o b(cid:1205)ng cách thêm t(cid:1263) khoá
virtual vào tr(cid:1133)(cid:1247)c khai báo hàm.
virtual
(cid:132) Ta mong mu(cid:1237)n thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
có th(cid:1223) truy xu(cid:1193)t hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1231)nh ngh(cid:429)a
(cid:79)(cid:1189)i (cid:1251) (cid:79)(cid:1247)p con:
pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien,
(cid:132) Trong ví d(cid:1257) trên, ta thêm t(cid:1263) khoá virtual
// thuc te: goi Xuat cua lop Nguoi
vào tr(cid:1133)(cid:1247)c khai báo c(cid:1259)a hàm xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 15 16 9/6/2009 9/6/2009
class Nguoi
{
protected:
class SinhVien : public Nguoi
{
protected:
char *MaSo;
char *HoTen;
int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
Nguoi(char *ht, int ns):NamSinh(ns)
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;}
virtual void Xuat() const
virtual
{
~Nguoi() {delete [] HoTen;}
virtual void Xuat() const
virtual
{
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi
{
protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++)
{
virtual void Xuat() const
virtual
{
an[i]->Xuat();
cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
}
};
const int N = 4; void main(){……..}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 12 11 9/6/2009 9/6/2009
(cid:132) (cid:46)(cid:1219)t qu(cid:1191) xu(cid:1193)t ra màn hình c(cid:1259)a ch(cid:1133)(cid:1131)ng trình
void main() {
Nguoi, Ho ten: Vien Van Sinh, Sinh Nam: 1982
Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh",
Nguoi, Ho ten: Le Thi Ha Dong, Sinh Nam: 1984
Nguoi, Ho ten: Tran Nhan Cong, Sinh Nam: 1984
”200001234", 1982); a[1] = new SinhVien("Le Thi Ha
Nguoi, Ho ten: Nguyen Thanh Nhan, Sinh Nam: 1960
(cid:132) (cid:55)(cid:1193)t c(cid:1191) (cid:80)(cid:1233)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1221)u (cid:255)(cid:1133)(cid:1255)c quan (cid:255)(cid:76)(cid:1223)m nh(cid:1133)
Dong",”200001235", 1984); a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan",
ng(cid:1133)(cid:1249)i vì thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con
1960);
XuatDs(4,a);
tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p Ng(cid:1133)(cid:1249)i.
}
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 14 13 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o cho phép gi(cid:1191)i quy(cid:1219)t v(cid:1193)n
(cid:132) Con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p con:
Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);
(cid:255)(cid:1221). Ta qui (cid:255)(cid:1231)nh m(cid:1245)t hàm thành ph(cid:1195)n là
ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o b(cid:1205)ng cách thêm t(cid:1263) khoá
virtual vào tr(cid:1133)(cid:1247)c khai báo hàm. virtual
(cid:132) Ta mong mu(cid:1237)n thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) có th(cid:1223) truy xu(cid:1193)t hàm thành ph(cid:1195)n (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1231)nh ngh(cid:429)a (cid:79)(cid:1189)i (cid:1251) (cid:79)(cid:1247)p con: pn->Xuat(); // Mong muon: goi Xuat cua lop sinh vien,
(cid:132) Trong ví d(cid:1257) trên, ta thêm t(cid:1263) khoá virtual
// thuc te: goi Xuat cua lop Nguoi
vào tr(cid:1133)(cid:1247)c khai báo c(cid:1259)a hàm xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 15 16 9/6/2009 9/6/2009
class Nguoi { protected:
class SinhVien : public Nguoi { protected:
char *MaSo;
char *HoTen; int NamSinh;
public:
public:
SinhVien(char *n, char *ms, int ns) :
Nguoi(n,ns) { MaSo = strdup(ms);}
Nguoi(char *ht, int ns):NamSinh(ns)
{HoTen = strdup(ht);}
~SinhVien() {delete [] MaSo;} virtual void Xuat() const virtual
{
~Nguoi() {delete [] HoTen;} virtual void Xuat() const virtual {
cout << "Sinh vien, Ho ten: " << HoTen
<< “, Nam sinh: “ <
cout << "Nguoi, Ho ten: " << HoTen
<< “, Nam Sinh: " << NamSinh;
}
};
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi
{
protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[])
{
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++)
{
virtual void Xuat() const
virtual
{
an[i]->Xuat();
cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
cout << "Nguoi, Ho ten: " << HoTen << “, Nam Sinh: " << NamSinh;
}
};
} };
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 18 17 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
class CongNhan : public Nguoi { protected:
double MucLuong;
void XuatDs(int n, Nguoi *an[]) {
public:
CongNhan(char *n, double ml, int ns) :
Nguoi(n,ns), MucLuong(ml) { }
for (int i = 0; i < n; i++) {
virtual void Xuat() const virtual
{
an[i]->Xuat(); cout << "\n";
}
cout << "Cong nhan, Ho ten: " << HoTen
<< “, Nam sinh: “ <
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn;
pn = new SinhVien("Vien Van Sinh“,"200001234“,1982);
pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th
const int N = 4;
void main()
{
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n
thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984);
a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984);
a[3] = new Nguoi("Nguyen Thanh Nhan", 1960);
XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các
(cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác
(cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265)
(cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251)
(cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[])
{
for (int i = 0; i < n; i++)
{
5.5. Ph(cid:1133)(cid:1131)ng th
Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a.
Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n
ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229)
là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã
có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat();
cout << "\n";
}
}
class CaSi : public Nguoi
{
protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns),
CatXe(cx) {}
void Xuat() const { cout << "Ca si, " << HoTen <<
" co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i.
9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n
tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235)
(cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i
là tính (cid:255)a hình
(polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131)
(cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217)
(cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh
ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a
(cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên
(cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm
có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251)
Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a
ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229)
(cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI
NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr
vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p
Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là
(cid:70)(cid:1195)n thi(cid:1219)t.
Name
Name
IdId
STUDENT
STUDENT
const int N = 4;
void main()
{
vtptr
vtptr
Xuat();
Name
Name
IdId
Nguoi *a[N];
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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
}
9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi
{
protected:
char *HoTen;
int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi,
ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi
(cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement
these methods?
Pure virtual
methods
class Shape
void print()
double area()
double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o:
virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u
(cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p
tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle
int x,y,r;
void print()
double area()
double perimeter()
class Rectangle
int x1,y1,x2,y2;
void print()
double area()
double perimeter()
class Triangle
int x1,y1,x2,y2,x3,y3;
void print()
double area()
double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i
(cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
(cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p
Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m
không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví
(cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c
(cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241)
ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a
(cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên
(cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i
dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i
ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p
Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a
ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class……..
Abstract class
Abstract subclass
Abstract subclass
(cid:127) A is an abstract class
(cid:127) B is public subclass of A
(cid:127) In B, the inherited method
MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass……
Abstract subclass
Demonstration
Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class
may be an abstract class.
(cid:132) User will input some shape details
(cid:132) Program will print out details of all shape
(cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance
of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle
Class Shape and Circle
Class Rectangle
Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result
Class ShapeList……, main(), Result
Class ShapeList
Class ShapeList
Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary
Summary
Summary
Summary
(cid:132) Virtual Method is a way to make polymorphism.
(cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters)
ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be
called using a virtual function table for every
class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract
class but you can declare a pointer to it
then, it points to an object of a concrete
subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises
Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009
}
}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 20 19 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
Nguoi *pn; pn = new SinhVien("Vien Van Sinh“,"200001234“,1982); pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien
5.5. Ph(cid:1133)(cid:1131)ng th const int N = 4; void main() {
Nguoi *a[N];
a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982);
(cid:132) Con tr(cid:1235) pn thu(cid:1245)c l(cid:1247)p Nguoi nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n (cid:255)(cid:1237)i (cid:87)(cid:1133)(cid:1255)ng sinh viên, vì v(cid:1201)y pn->Xuat() th(cid:1269)c hi(cid:1227)n thao tác xu(cid:1193)t c(cid:1259)a l(cid:1247)p sinh viên.
a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984); a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a);
}
(cid:132) Tr(cid:1251) (cid:79)(cid:1189)i ví d(cid:1257) trên, khi i a[i] l(cid:1195)n l(cid:1133)(cid:1255)t tr(cid:1235) (cid:255)(cid:1219)n các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các lo(cid:1189)i khác nhau, thao tác (cid:87)(cid:1133)(cid:1131)ng (cid:1261)ng v(cid:1247)i l(cid:1247)p s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o xuat (cid:255)(cid:1133)(cid:1255)c khai báo (cid:1251) (cid:79)(cid:1247)p Nguoi cho phép s(cid:1265) (cid:71)(cid:1257)ng con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (Nguoi) nh(cid:1133)ng tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i (cid:87)(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con (Sinh viên, công nhân) g(cid:1233)i (cid:255)úng thao tác (cid:1251) (cid:79)(cid:1247)p con:
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 22 21 9/6/2009 9/6/2009
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
void XuatDs(int n, Nguoi *an[]) {
for (int i = 0; i < n; i++) {
5.5. Ph(cid:1133)(cid:1131)ng th Dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o, ta d(cid:1225) dàng nâng c(cid:1193)p s(cid:1265)a ch(cid:1267)a. Vi(cid:1227)c thêm m(cid:1245)t lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng m(cid:1247)i r(cid:1193)t (cid:255)(cid:1131)n gi(cid:1191)n, ta không c(cid:1195)n ph(cid:1191)i s(cid:1265)a (cid:255)(cid:1241)i thao tác x(cid:1265) lý (hàm XuatDs). Qui trình thêm ch(cid:1229) là xây d(cid:1269)ng l(cid:1247)p con k(cid:1219) th(cid:1263)a t(cid:1263) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) ho(cid:1211)c các l(cid:1247)p con (cid:255)ã có và (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c ((cid:1191)o) (cid:1251) (cid:79)(cid:1247)p m(cid:1247)i t(cid:1189)o n(cid:1219)u c(cid:1195)n
an[i]->Xuat(); cout << "\n";
}
}
class CaSi : public Nguoi { protected:
double CatXe;//tien cong cho ca si
(cid:127) Hàm XuatDs không thay (cid:255)(cid:1241)i, nh(cid:1133)ng nó có th(cid:1223) ho(cid:1189)t (cid:255)(cid:1245)ng
public:
cho các lo(cid:1189)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng ca s(cid:429) thu(cid:1245)c l(cid:1247)p m(cid:1247)i ra (cid:255)(cid:1249)i.
(cid:127) Có th(cid:1223) xem nh(cid:1133) thao tác XuatDs (cid:255)(cid:1133)(cid:1255)c vi(cid:1219)t tr(cid:1133)(cid:1247)c cho
CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns), CatXe(cx) {} void Xuat() const { cout << "Ca si, " << HoTen << " co cat xe " << CatXe;}
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 24 23 9/6/2009
các l(cid:1247)p con cháu ch(cid:1133)a ra (cid:255)(cid:1249)i. 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:132)(cid:132) LL(cid:1133)u ý(cid:1133)u ý
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng thông qua con tr(cid:1235).
(cid:133) Mu(cid:1237)n m(cid:1245)t hàm tr(cid:1251) thành ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có hai cách:
(cid:132) Khai báo v(cid:1247)i t(cid:1263) khoá virtual
(cid:133) Khi g(cid:1233)i m(cid:1245)t thao tác, kh(cid:1191) (cid:81)(cid:259)ng ch(cid:1233)n (cid:255)úng phiên b(cid:1191)n tu(cid:484) theo (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng (cid:255)(cid:1223) th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235) (cid:255)(cid:1219)n l(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i là tính (cid:255)a hình (polymorphisms).
(cid:132) Hàm t(cid:1133)(cid:1131)ng (cid:1261)ng (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (cid:255)ã là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o.
(cid:133) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o ch(cid:1229) ho(cid:1189)t (cid:255)(cid:1245)ng n(cid:1219)u các hàm (cid:1251) (cid:79)(cid:1247)p c(cid:1131) (cid:86)(cid:1251) và l(cid:1247)p con có nghi th(cid:1261)c giao ti(cid:1219)p gi(cid:1237)ng h(cid:1227)t nhau.
(cid:133) (cid:49)(cid:1219)u (cid:1251) (cid:79)(cid:1247)p con (cid:255)(cid:1231)nh ngh(cid:429)a l(cid:1189)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thì s(cid:1217) (cid:74)(cid:1233)i ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1251) (cid:79)(cid:1247)p c(cid:1131) s(cid:1251) (g(cid:1195)n nh(cid:1193)t có (cid:255)(cid:1231)nh ngh(cid:429)a).
(cid:133) (cid:38)(cid:1131) ch(cid:1219) (cid:255)a hình (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n nh(cid:1249) (cid:1251) (cid:80)(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng có thêm m(cid:1245)t b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o. B(cid:1191)ng này ch(cid:1261)a (cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a các ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o và nó (cid:255)(cid:1133)(cid:1255)c trình biên (cid:71)(cid:1231)ch kh(cid:1251)i t(cid:1189)o m(cid:1245)t cách ng(cid:1195)m (cid:255)(cid:1231)nh khi thi(cid:1219)t l(cid:1201)p (cid:255)(cid:1237)i (cid:87)(cid:1133)(cid:1255)ng.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 26 25 9/6/2009 9/6/2009
5.5. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)cc (cid:1191)(cid:1191)o,o, (cid:255)a h(cid:255)a hììnhnh
(cid:132) (cid:38)(cid:1131) ch(cid:1219) th(cid:1269)c hi(cid:1227)n ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o
(cid:133) Khi thao tác (cid:255)(cid:1133)(cid:1255)c th(cid:1269)c hi(cid:1227)n thông qua con tr(cid:1235), hàm có (cid:255)(cid:1231)a ch(cid:1229) trong b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o s(cid:1217) (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:133) Trong ví d(cid:1257) trên, m(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Ng(cid:1133)(cid:1249)i có b(cid:1191)ng ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o có m(cid:1245)t ph(cid:1195)n t(cid:1265) là (cid:255)(cid:1231)a ch(cid:1229) hàm Nguoi::Xuat. M(cid:1243)i (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p SinhVien có b(cid:1191)ng t(cid:1133)(cid:1131)ng t(cid:1269) nh(cid:1133)ng n(cid:1245)i dung là (cid:255)(cid:1231)a ch(cid:1229) (cid:70)(cid:1259)a hàm SinhVien::Xuat.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 27 28 9/6/2009 9/6/2009
NGUOI NGUOI
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
vtptr vtptr
Xuat();
Trong ví d(cid:1257) qu(cid:1191)n lý danh sách các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c các l(cid:1247)p Nguoi, SinhVien, CongNhan, … Thao tác d(cid:1233)n d(cid:1213)p (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng là (cid:70)(cid:1195)n thi(cid:1219)t.
Name Name IdId
STUDENT STUDENT
const int N = 4; void main() {
vtptr vtptr
Xuat();
Name Name IdId
Nguoi *a[N]; 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++)
masomaso
delete a[i];
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 29 30 9/6/2009
} 9/6/2009
6.6. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c huc hu(cid:1273)(cid:1273) bb(cid:1235)(cid:1235) (cid:1191)(cid:1191)oo
class Nguoi { protected:
char *HoTen; int NamSinh;
public:
(cid:132) Thông qua con tr(cid:1235) thu(cid:1245)c l(cid:1247)p c(cid:1131) s(cid:1251) Nguoi, ch(cid:1229) có ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p Nguoi (cid:255)(cid:1133)(cid:1255)c g(cid:1233)i.
(cid:132) (cid:264)(cid:1223) (cid:69)(cid:1191)o (cid:255)(cid:1191)m vi(cid:1227)c d(cid:1233)n d(cid:1213)p là (cid:255)(cid:1195)y (cid:255)(cid:1259), ta
dùng ph(cid:1133)(cid:1131)ng th(cid:1261)c hu(cid:1273) (cid:69)(cid:1235) (cid:1191)o.
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); }
};
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 32 31 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) L(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng có ít nh(cid:1193)t m(cid:1245)t ph(cid:1133)(cid:1131)ng
(cid:132) Result of so-high generation
th(cid:1261)c thu(cid:1195)n (cid:1191)o
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o là ph(cid:1133)(cid:1131)ng th(cid:1261)c
không có ph(cid:1195)n thân (ph(cid:1195)n (cid:255)(cid:1231)nh ngh(cid:429)a)
How will we implement these methods?
Pure virtual methods
class Shape void print() double area() double perimeter()
(cid:132) Cú pháp c(cid:1259)a ph(cid:1133)(cid:1131)ng th(cid:1261)c thu(cid:1195)n (cid:1191)o: virtual DataType Method (…) = 0;
(cid:132) Ta không th(cid:1223) (cid:87)(cid:1189)o m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng c(cid:1259)a l(cid:1247)p tr(cid:1263)u (cid:87)(cid:1133)(cid:1255)ng, nh(cid:1133)ng có th(cid:1223) khai báo con tr(cid:1235) (cid:70)(cid:1259)a l(cid:1247)p tr(cid:1263)u t(cid:1133)(cid:1255)ng.
(cid:132) Con tr(cid:1235) này ph(cid:1191)i (cid:255)(cid:1133)(cid:1255)c tr(cid:1235) (cid:255)(cid:1219)n m(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng
class Circle int x,y,r; void print() double area() double perimeter()
class Rectangle int x1,y1,x2,y2; void print() double area() double perimeter()
class Triangle int x1,y1,x2,y2,x3,y3; void print() double area() double perimeter()
(cid:70)(cid:1259)a m(cid:1245)t l(cid:1247)p c(cid:1257) th(cid:1223).
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 33 34 9/6/2009 9/6/2009
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
7.7. Ph(cid:1133)(cid:1131)ng th
Ph(cid:1133)(cid:1131)ng th(cid:1261)(cid:1261)c thu
c thu(cid:1195)(cid:1195)nn (cid:1191)(cid:1191)o, lo, l(cid:1247)(cid:1247)p trp tr(cid:1263)(cid:1263)u t(cid:1133)u t(cid:1133)(cid:1255)(cid:1255)ngng
(cid:132) (cid:47)(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng là l(cid:1247)p c(cid:1131) s(cid:1251) không có (cid:255)(cid:1237)i (cid:87)(cid:1133)(cid:1255)ng nào thu(cid:1245)c chính nó. M(cid:1245)t (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p (cid:70)(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng ph(cid:1191)i thu(cid:1245)c m(cid:1245)t trong các l(cid:1247)p con.
(cid:132) Xét các l(cid:1247)p Circle, Rectangle, Square k(cid:1219) th(cid:1263)a t(cid:1263)
(cid:132) Trong ví d(cid:1257) trên, các hàm thành ph(cid:1195)n trong l(cid:1247)p Shape là ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý. Nó b(cid:1191)o (cid:255)(cid:1191)m không th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape. Ví (cid:71)(cid:1257) trên c(cid:458)ng (cid:255)(cid:1231)nh ngh(cid:429)a n(cid:1245)i dung cho ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý, nh(cid:1133)ng ch(cid:1229) có các (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p con có th(cid:1223) (cid:74)(cid:1233)i.
(cid:79)(cid:1247)p Shape
(cid:132) Ph(cid:1133)(cid:1131)ng th(cid:1261)c (cid:1191)o thu(cid:1195)n tuý có ý ngh(cid:429)a cho vi(cid:1227)c t(cid:1241) ch(cid:1261)c s(cid:1131)(cid:3)(cid:255)(cid:1239) phân c(cid:1193)p các l(cid:1247)p, nó (cid:255)óng vai trò ch(cid:1263)a (cid:86)(cid:1209)n ch(cid:1243) tr(cid:1237)ng cho các l(cid:1247)p con (cid:255)(cid:76)(cid:1221)n vào v(cid:1247)i phiên (cid:69)(cid:1191)n phù h(cid:1255)p.
(cid:132) (cid:37)(cid:1191)n thân các l(cid:1247)p con c(cid:1259)a l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
(cid:132) Trong ví d(cid:1257) trên, các hàm trong l(cid:1247)p Shape có n(cid:1245)i dung nh(cid:1133)ng n(cid:1245)i dung không có ý ngh(cid:429)a. (cid:264)(cid:1239)ng th(cid:1249)i ta luôn luôn có th(cid:1223) (cid:87)(cid:1189)o (cid:255)(cid:1133)(cid:1255)c (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng thu(cid:1245)c l(cid:1247)p Shape, (cid:255)i(cid:1221)u này không (cid:255)úng v(cid:1247)i t(cid:1133) t(cid:1133)(cid:1251)ng c(cid:1259)a ph(cid:1133)(cid:1131)ng pháp lu(cid:1201)n h(cid:1133)(cid:1247)ng (cid:255)(cid:1237)i t(cid:1133)(cid:1255)ng.
(cid:70)(cid:458)ng có th(cid:1223) là l(cid:1247)p c(cid:1131) s(cid:1251) tr(cid:1263)u t(cid:1133)(cid:1255)ng
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 36 35 9/6/2009 9/6/2009
Abstract class…….. Abstract class
Abstract subclass Abstract subclass
(cid:127) A is an abstract class (cid:127) B is public subclass of A (cid:127) In B, the inherited method MA() is not overriden yet
(cid:206) B is abstract class
Error: Cannot create instance of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 37 38 9/6/2009 9/6/2009
Abstract subclass…… Abstract subclass
Demonstration Demonstration
(cid:132) The
following program depicts using
abstract class.
(cid:132) People generate all concrete classes as
Circle, Rectangle,… into Shape class.
Subclass of a concrete class may be an abstract class.
(cid:132) User will input some shape details (cid:132) Program will print out details of all shape (cid:132) Values of area and perimeter of each
shape will be printed also.
Error: Cannot create instance of abstract class ‘B’
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 39 40 9/6/2009 9/6/2009
Class Shape and Circle Class Shape and Circle
Class Rectangle Class Rectangle
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 41 42 9/6/2009 9/6/2009
, main(), Result Class ShapeList……, main(), Result Class ShapeList
Class ShapeList Class ShapeList
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 43 44 9/6/2009 9/6/2009
Summary Summary
Summary Summary
(cid:132) Virtual Method is a way to make polymorphism. (cid:132) Syntax for virtual method:
(cid:132) Abstract class is a result of so-high
generation.
virtual ReturnType Method (parameters) ReturnType virtual Method (parameters)
(cid:132) Abstract class must have at least one pure
virtual method.
(cid:132) Compiler will determine the right method will be called using a virtual function table for every class which contains virtual methods.
(cid:132) Pure virtual method is a virtual method but it has
no code.
(cid:132) Syntax for pure virtual method:
virtual ReturnType Method (parameters)=0;
(cid:132) You can not create an object of abstract class but you can declare a pointer to it then, it points to an object of a concrete subclass.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 46 45 9/6/2009 9/6/2009
Exercises Exercises
(cid:132) Using the class Object, implement
classes: Father, Mother, Son, Daughter.
(cid:132) Write a program will
(cid:133) Input a list of members in a family. Store them
into a Vector object.
(cid:133) Print out members of the family.
TPTU(cid:1192)N - LTH(cid:264)T TPTU(cid:1192)N - LTH(cid:264)T 47 48 9/6/2009 9/6/2009