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