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