intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng môn học Lập trình hướng đối tượng - Chương 4: Sự kế thừa

Chia sẻ: Ngocnga Ngocnga | Ngày: | Loại File: PDF | Số trang:74

63
lượt xem
3
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Sự kế thừa là một đặc điểm của ngôn ngữ dùng để biểu diễn mối quan hệ đặc biệt giữa các lớp. Chương này sẽ trang bị cho người học một số kiến thức về sự kế thừa như: Kế thừa đơn, phạm vi truy xuất, phương thức thiết lập và huỷ bỏ, con trỏ và kế thừa. Mời các bạn cùng tham khảo để nắm bắt các nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng môn học Lập trình hướng đối tượng - Chương 4: Sự kế thừa

  1. Chöông 4 Söï keá thöøa 1
  2. Noäi dung 1. Môû ñaàu 2. Keá thöøa ñôn 3. Phaïm vi truy xuaát 4. Phöông thöùc thieát laäp vaø huyû boû 5. Con troû vaø keá thöøa 2
  3. 4.1 Môû ñaàu - Söï keá thöøa laø moät ñaëc ñieåm cuûa ngoân ngöõ duøng ñeå bieåu dieãn moái quan heä ñaëc bieät giöõa caùc lôùp. Caùc lôùp ñöôïc tröøu töôïng hoùa vaø toå chöùc thaønh moät sô ñoà phaân caáp lôùp. - Keá thöøa laø moät cô cheá tröøu töôïng hoùa. Thuû tuïc vaø haøm laø cô cheá tröøu töôïng hoùa cho giaûi thuaät, record vaø struct laø tröøu töôïng hoùa cho döõ lieäu. Khaùi nieäm lôùp trong C++, keát hôïp döõ lieäu vaø thuû tuïc ñeå ñöôïc kieåu döõ lieäu tröøu töôïng vôùi giao dieän ñoäc laäp vôùi caøi ñaët vaø cho ngöôøi söû duïng caûm giaùc thoaûi maùi nhö kieåu döõ lieäu coù saün - Söï keá thöøa laø moät möùc cao hôn cuûa tröøu töôïng hoùa. cung caáp moät cô cheá gom chung caùc lôùp coù lieân quan vôùi nhau thaønh moät möùc khaùi quaùt hoùa ñaëc tröng cho toaøn boä caùc lôùp noùi treân. Caùc lôùp vôùi caùc ñaëc ñieåm töông töï nhau coù theå ñöôïc toå chöùc thaønh moät sô ñoà phaân caáp keá thöøa. Lôùp ôû treân cuøng laø tröøu töôïng hoùa cuû3a toaøn boä caùc lôùp oû beân döôùi noù.
  4. Môû ñaàu  Quan heä laø 1: Keá thöøa ñöôïc söû duïng thoâng duïng nhaát ñeå bieåu dieãn quan heä laø moät. • Moät sinh vieân laø moät ngöôøi • Moät hình troøn laø moät hình ellipse • Moät tam giaùc laø moät ña giaùc  Keá thöøa taïo khaû naêng xaây döïng lôùp môùi töø lôùp ñaõ coù, trong ñoù haøm thaønh phaàn ñöôïc thöøa höôûng töø lôùp cha. Trong C++, keá thöøa coøn ñònh nghóa söï töông thích, nhôø ñoù ta coù cô cheá chuyeån kieåu töï ñoäng.  Keá thöøa vöøa coù khaû naêng taïo cô cheá khaùi quaùt hoaù vöøa coù khaû naêng chuyeân bieät hoaù.  Keá thöøa cho pheùp toå chöùc caùc lôùp chia seû maõ chöông trình chung nhôø vaäy coù theå deã daøng söûa chöõa, naâng caáp heä thoáng. 4
  5. Môû ñaàu  Keá thöøa thöôøng ñöôïc duøng theo hai caùch: • Ñeå phaûn aùnh moái quan heä giöõa caùc lôùp. Laø coâng cuï ñeå toå chöùc vaø phaân caáp lôùp döïa vaøo söï chuyeân bieät hoùa, trong ñoù moät vaøi haøm thaønh phaàn cuûa lôùp con laø phieân baûn hoaøn thieän hoaëc ñaëc bieät hoaù cuûa phieân baûn ôû lôùp cha. Trong C++ moái quan heä naøy thöôøng ñöôïc caøi ñaët söû duïng:  Keá thöøa public.  Haøm thaønh phaàn laø phöông thöùc aûo • Ñeå phaûn aùnh söï chia seû maõ chöông trình giöõa caùc lôùp khoâng coù quan heä veà maët ngöõ nghóa nhöng coù theå coù toå chöùc döõ lieäu vaø maõ chöông trình töông töï nhau. Trong C++, cô cheá chia seû maõ naøy thöôøng ñöôïc caøi ñaët duøng:  Keá thöøa private.  Haøm thaønh phaàn khoâng laø phöông 5 thöùc aûo.
  6. 4.2 Keá thöøa ñôn  Keá thöøa coù theå ñöôïc thöïc hieän ñeå theå hieän moái quan heä 'laø moät'.  Xeùt hai khaùi nieäm ngöôøi vaø sinh vieân vôùi moái quan heä töï nhieân: moät 'sinh vieân' laø moät 'ngöôøi'. Trong C++, ta coù theå bieåu dieãn khaùi nieäm treân, moät sinh vieân laø moät ngöôøi coù theâm moät soá thoâng tin vaø moät soá thao taùc (rieâng bieät cuûa sinh vieân).  Ta toå chöùc lôùp sinh vieân keá thöøa töø lôùp ngöôøi. Lôùp ngöôøi ñöôïc goïi laø lôùp cha (superclass) hay lôùp cô sôû (base class). Lôùp sinh vieân ñöôïc goïi laø lôùp con (subclass) hay lôùp daãn xuaát (derived class). 6
  7. Keá thöøa ñôn class Nguoi { friend class SinhVien; char *HoTen; int NamSinh; public: Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout
  8. Keá thöøa ñôn class SinhVien : public Nguoi { char *MaSo; public: SinhVien(char *ht, char *ms, int ns) : Nguoi(ht,ns) { MaSo = strdup(ms);} ~SinhVien() {delete [] MaSo;} void Xuat() const; }; ostream& operator
  9. Keá thöøa ñôn void Nguoi::Xuat() const { cout
  10. Keá thöøa ñôn void main() { Nguoi p1("Le Van Nhan",1980); SinhVien s1("Vo Vien Sinh", "200002541",1984); cout
  11. Töï ñoäng keá thöøa caùc ñaëc tính cuûa lôùp cha  Khai baùo class SinhVien : public Nguoi { //... }; Cho bieát lôùp sinh vieân keá thöøa töø lôùp ngöôøi. Khi ñoù sinh vieân ñöôïc thöøa höôûng caùc ñaëc tính cuûa lôùp ngöôøi.  Veà maët döõ lieäu: Moãi ñoái töôïng sinh vieân töï ñoäng coù thaønh phaàn döõ lieäu hoï teân vaø naêm sinh cuûa ngöôøi.  Veà maët thao taùc: Lôùp sinh vieân ñöôïc töï ñoäng keá thöøa caùc thao taùc cuûa lôùp cha. Ñaây chính laø khaû naêng söû duïng laïi maõ chöông trình.  Rieâng phöông thöùc thieát laäp khoâng ñöôïc keá thöøa. 11
  12. Töï ñoäng keá thöøa caùc ñaëc tính cuûa lôùp cha Nguoi p1("Le Van Nhan",1980); SinhVien s1("Vo Vien Sinh", "200002541",1984); p1.An(); cout
  13. Ñònh nghóa laïi thao taùc ôû lôùp con  Ta coù theå ñònh nghóa laïi caùc ñaëc tính ôû lôùp con ñaõ coù ôû lôùp cha, vieäc ñònh nghóa chuû yeáu laø thao taùc, baèng caùch khai baùo gioáng heät nhö ôû lôùp cha. class SinhVien : public Nguoi { char *MaSo; public: //... void Xuat() const; }; void SinhVien::Xuat() const { cout
  14. Ñònh nghóa laïi thao taùc ôû lôùp con  Vieäc ñònh nghóa laïi thao taùc ôû lôùp con ñöôïc thöïc hieän khi thao taùc ôû lôùp con khaùc thao taùc ôû lôùp cha. Thoâng thöôøng laø caùc thao taùc xuaát, nhaäp.  Ta cuõng coù theå ñònh nghóa laïi thao taùc ôû lôùp con trong tröôøng hôïp giaûi thuaät ôû lôùp con ñôn giaûn hôn (toâ maøu ña giaùc, tính modun cuûa soá aûo...). class DaGiac { // ... void Ve() const; void ToMau() const; }; class HCN { void ToMau() const; }; 14
  15. Ñònh nghóa laïi thao taùc ôû lôùp con  Hoaëc ôû lôùp con, thao taùc khoâng coù taùc duïng class Ellipse { //... public: //... void rotate(double rotangle){ //...} }; class Circle:public Ellipse { public: //... void rotate(double rotangle){/* do nothing */} }; 15
  16. 4.3 Raøng buoäc ngöõ nghóa ôû lôùp con  Keá thöøa coù theå ñöôïc aùp duïng cho quan heä keá thöøa mang yù nghóa raøng buoäc, ñoái töôïng ôû lôùp con laø ñoái töôïng ôû lôùp cha nhöng coù döõ lieäu bò raøng buoäc. • Hình troøn laø Ellipse raøng buoäc baùn kính ngang doïc baèng nhau. • Soá aûo laø soá phöùc raøng buoäc phaàn thöïc baèng 0. • Hình vuoâng laø hình chöõ nhaät raøng buoäc hai caïnh ngang vaø doïc baèng nhau…  Trong tröôøng hôïp naøy, caùc haøm thaønh phaàn phaûi baûo ñaûm söï raøng buoäc döõ lieäu ñöôïc toân troïng. Lôùp soá aûo sau ñaây laø moät ví duï minh hoaï. 16
  17. Raøng buoäc ngöõ nghóa ôû lôùp con class Complex { friend ostream& operator
  18. Raøng buoäc ngöõ nghóa ôû lôùp con class Imag: public Complex { public: Imag(double i = 0):Complex(0, i){} Imag(const Complex &c) : Complex(0, c.im){} Imag& operator = (const Complex &c) {re = 0; im = c.im; return *this;} double Norm() const {return fabs(im);} }; void main() { Imag i = 1; Complex z1(1,1), z3 = z1 - i; // z3 = (1,0) i = Complex(5,2); // i la so ao (0,2) Imag j = z1; // j la so ao (0,1) cout
  19. Raøng buoäc ngöõ nghóa ôû lôùp con  Trong ví duï treân lôùp soá aûo (Imag) keá thöøa haàu heát caùc thao taùc cuûa lôùp soá phöùc (Complex). Tuy nhieân ta muoán raøng buoäc moïi ñoái töôïng thuoäc lôùp soá aûo ñeàu phaûi coù phaàn thöïc baèng 0. Vì vaäy phaûi ñònh nghóa laïi caùc haøm thaønh phaàn coù theå vi phaïm ñieàu naøy. Ví duï pheùp toaùn gaùn phaûi ñöôïc ñònh nghóa laïi ñeå baûo ñaûm raøng buoäc naøy. class Imag: public Complex { public: //... Imag(const Complex &c) : Complex(0, c.im){} Imag& operator = (const Complex &c) {re = 0; im = c.im; return *this;} }; 19
  20. Raøng buoäc ngöõ nghóa ôû lôùp con  Ví duï sau minh hoaï theâm raøng buoäc ngöõ nghóa ôû lôùp con class HCN:public Hinh { Diem TrenTrai; double rong, cao; public: HCN(Diem tt, double r, double c); HCN(double ttx, double tty, double r, double c); HCN():TrenTrai(4,6), rong(7), cao(4){} virtual double DienTich() const {return rong*cao;} virtual void Nhap(); virtual void Xuat(); virtual void PhongTo(double tiLe); virtual void GianNgang(double tiLe); virtual void GianDoc(double tiLe); }; 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2