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

Kỹ thuật lập trình hướng đối tượng - Chapter 6

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:43

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

Tính kế thừa • Giới thiệu tính kế thừa • Điều khiển truy cập lớp cơ sở • Sử dụng các thành viên được bảo vệ • Hàm tạo, hàm hủy và tính kế thừa • Tính đa kế thừa • Lớp cơ sở ảo

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật lập trình hướng đối tượng - Chapter 6

  1. Chöông 6 Tính keá thöøa • Giôùi thieäu tính keá thöøa • Ñieàu khieån truy caäp lôùp cô sôû • Söû duïng caùc thaønh vieân ñöôïc baûo veä • Haøm taïo, haøm huûy vaø tính keá thöøa • Tính ña keá thöøa • Lôùp cô sôû aûo
  2. 164 Chöông 6 Tính keá thöøa
  3. 165 Chöông 6 Tính keá thöøa I/ Giôùi thieäu tính keá thöøa (inheritance) Tính keá thöøa laø cô cheá nhôø ñoù moät lôùp coù theå keá thöøa caùc ñaëc ñieåm cuûa moät lôùp khaùc. Tính keá thöøa hoå trôï khaùi nieäm phaân loaïi theo thöù baäc (hierachical classification) cuûa lôùp, ngoaøi ra coøn hoå trôï tính ña hình (polymorphism). • Lôùp cô sôû (base class) laø lôùp ñöôïc keá thöøa bôûi moät lôùp khaùc. Lôùp daãn xuaát (derive class) laø lôùp keá thöøa töø moät lôùp cô sôû. Lôùp cô sôû xaùc ñònh caùc tính chaát maø seõ trôû neân thoâng duïng cho caùc lôùp daãn xuaát. Nghiaõ laø lôùp cô sôû hieån thò moâ taû toång quaùt nhaát moät taäp hôïp caùc ñaëc ñieåm. Moät lôùp daãn xuaát keá thöøa caùc ñaëc ñieåm toång quaùt naøy vaø boå sung theâm caùc tính chaát rieâng cuûa lôùp daãn xuaát. Cuù phaùp khai baùo cho lôùp daãn xuaát class derived_class_name : access_specifier base_class_name { // body of class }; base_class_name Teân lôùp cô sôû derived_class_name Teân lôùp daãn xuaát chæ ñònh truy caäp bao goàm : public, private vaø protected access_specifier • Töø khoaù public baùo cho trình bieân dòch bieát raèng lôùp cô sôû seõ ñöôïc keá thöøa sao cho moïi thaønh vieân chung cuûa lôùp cô sôû cuõng seõ laø caùc thaønh vieân chung cuûa lôùp daãn xuaát. Tuy nhieân, moïi thaønh vieân rieâng cuûa lôùp cô sôû vaãn coøn rieâng ñoái vôùi noù vaø khoâng ñöôïc truy caäp tröïc tieáp bôûi lôùp daãn xuaát. B Ví duï 1.1 // A simple example of inheritance. #include D Hình 6.1 Söï keá thöøa ñôn
  4. 166 Chöông 6 Tính keá thöøa // Define base class. class base { int i; public: void set_i(int n); int get_i(); }; // Define derived class. class derived : public base { int j; public: void set_j(int n); int mul(); }; // Set value i in base. void base::set_i(int n) { i = n; } // Return value of i in base. int base::get_i() { return i; } // Set value of j in derived. void derived::set_j(int n) { j = n; } // Return value of base's i times derived's j. int derived::mul() { // derived class can call base class public member functions return j * get_i(); }
  5. 167 Chöông 6 Tính keá thöøa int main() { derived ob; ob.set_i(10); // load i in base ob.set_j(4); // load j in derived cout
  6. 168 Chöông 6 Tính keá thöøa // Derive Apple class. class Apple : public fruit { enum yn cooking; enum yn crunchy; enum yn eating; public: void seta(char *n, enum color c, enum yn ck, enum yn crchy, enum yn e); void show(); }; // Derive orange class. class Orange : public fruit { enum yn juice; enum yn sour; enum yn eating; public: void seto(char *n, enum color c, enum yn j, enum yn sr, enum yn e); void show(); }; void Apple::seta(char *n, enum color c, enum yn ck, enum yn crchy, enum yn e) { strcpy(name, n); annual = no; perennial = yes; tree = yes; tropical = no; clr = c; cooking = ck; crunchy = crchy; eating = e; } void Orange::seto(char *n, enum color c, enum yn j, enum yn sr, enum yn e) { strcpy(name, n);
  7. 169 Chöông 6 Tính keá thöøa annual = no; perennial = yes; tree = yes; tropical = yes; clr = c; juice = j; sour = sr; eating = e; } void Apple::show() { cout
  8. 170 Chöông 6 Tính keá thöøa void out(enum yn x) { if(x==no) cout
  9. 171 Chöông 6 Tính keá thöøa II/ Ñieàu khieån truy caäp lôùp cô sôû Chæ ñònh truy caäp (access_specifier) xaùc ñònh caùch maø caùc phaàn töû cuûa lôùp cô sôû ñöôïc keá thöøa bôûi lôùp daãn xuaát. • Töø khoaù private chæ ñònh caùc thaønh vieân chung lôùp cô sôû trôû thaønh caùc thaønh vieân rieâng cuûa lôùp daãn xuaát, nhöng nhöõng thaønh vieân naøy vaãn coøn ñöôïc truy caäp bôûi caùc haøm thaønh vieân cuûa lôùp daãn xuaát. Ví duï 2.1 #include class base { int x; public: void setx(int n) { x = n; } void showx() { cout
  10. 172 Chöông 6 Tính keá thöøa return 0; } Ví duï 2.2 Lôùp daãn xuaát khoâng theå truy caäp ñeán caùc thaønh vieân rieâng cuûa lôùp cô sôû class base { int x; public: void setx(int n) { x = n; } void showx() { cout
  11. 173 Chöông 6 Tính keá thöøa // Inherit base as private. class derived : private base { int y; public: void sety(int n) { y = n; } void showy() { cout
  12. 174 Chöông 6 Tính keá thöøa // Inherit base as private. class derived : private base { int y; public: // setx is accessible from within derived void setxy(int n, int m) { setx(n); y = m; } // showx is accessible from within derived void showxy() { showx(); cout
  13. 175 Chöông 6 Tính keá thöøa Baøi taäp II 1. Xeùt ñoaïn chöông trình sau #include class mybase { int a, b; public: int c; void setab(int i, int j) { a = i; b = j; } void getab(int &i, int &j) { i = a; j = b; } }; class derived1 : public mybase { // ... }; class derived2 : private mybase { // ... }; int main() { derived1 o1; derived2 o2; int i, j; // ... } Trong haøm main() caâu leänh naøo sau ñaây laø hôïp leä : A. o1.getab(i,j) ; B. o2.getab(i,j) ; C. o1.c = 10 ; D. o2.c = 10 ; 2. Ñieàu gì xaûy ra khi moät thaønh vieân rieâng ñöôïc keá thöøa nhö moät thaønh vieân chung ? Ñieàu gì xaûy ra khi noù ñöôïc keá thöøa nhö moät thaønh vieân rieâng ?
  14. 176 Chöông 6 Tính keá thöøa III/ Söû duïng caùc thaønh vieân ñöôïc baûo veä (protected members) Vôùi caùc chæ ñònh truy caäp public vaø private, moät lôùp daãn xuaát khoâng truy caäp ñöôïc caùc thaønh vieân rieâng cuûa lôùp cô sôû. Tuy nhieân, seõ coù nhöõng luùc muoán moät thaønh vieân cuûa lôùp cô sôû vaãn laø rieâng nhöng vaãn cho pheùp lôùp daãn xuaát truy caäp tôùi noù. • Chæ ñònh truy caäp protected, töông ñöông vôùi chæ ñònh private vôùi moät ngoaïi leä duy nhaát laø caùc thaønh vieân ñöôïc baûo veä (protected members) cuûa lôùp cô sôû coù theå ñöôïc truy caäp ñoái vôùi caùc thaønh vieân cuûa moät lôùp daãn xuaát töø lôùp cô sôû ñoù. Beân ngoaøi lôùp cô sôû hoaëc lôùp daãn xuaát, caùc thaønh vieân ñöôïc baûo veä khoâng theå ñöôïc truy caäp. Daïng toång quaùt cuûa khai baùo lôùp : class class_name { // private members protected : // protected members public : // public members }; Khi moät thaønh vieân ñöôïc baûo veä cuûa moät lôùp cô sôû ñöôïc keá thöøa bôûi lôùp daãn xuaát vôùi chæ ñònh public, noù trôû thaønh thaønh vieân ñöôïc baûo veä cuûa lôùp daãn xuaát. Neáu lôùp daãn xuaát ñöôïc keá thöøa vôùi chæ ñònh private, thì moät thaønh vieân ñöôïc baûo veä cuûa lôùp cô sôû trôû thaønh thaønh vieân rieâng cuûa lôùp daãn xuaát. Lôùp cô sôû coù theå ñöôïc keá thöøa vôùi chæ ñònh protected bôûi lôùp daãn xuaát, khi ñoù caùc thaønh vieân chung vaø ñöôïc baûo veä cuûa lôùp cô sôû trôû thaønh caùc thaønh vieân ñöôïc baûo veä cuûa lôùp daãn xuaát. Coøn caùc thaønh vieân rieâng cuûa lôùp cô sôû vaãn coøn rieâng ñoái vôùi lôùp cô sôû vaø khoâng ñöôïc truy caäp bôûi lôùp daãn xuaát.
  15. 177 Chöông 6 Tính keá thöøa Ví duï 3.1 Truy caäp caùc thaønh vieân chung, rieâng vaø ñöôïc baûo veä cuûa lôùp cô sôû #include class samp { // private by default int a; protected: // still private relative to samp int b; public: int c; samp(int n, int m) { a = n; b = m; } int geta() { return a; } int getb() { return b; } }; int main() { samp ob(10, 20); // ob.b = 99; Error! b is protected and thus private ob.c = 30; // OK, c is public cout
  16. 178 Chöông 6 Tính keá thöøa void setab(int n, int m) { a = n; b = m; } }; class derived : public base { int c; public: void setc(int n) { c = n; } // this function has access to a and b from base void showabc() { cout
  17. 179 Chöông 6 Tính keá thöøa void setab(int n, int m) { a = n; b = m; } }; class derived : protected base { // inherit as protected int c; public: void setc(int n) { c = n; } // this function has access to a and b from base void showabc() { cout
  18. 180 Chöông 6 Tính keá thöøa Baøi taäp III 1. Laäp baûng toång keát veà quyeàn truy caäp cuûa lôùp daãn xuaát vôùi söï keá thöøa ñôn Thuoäc tính thaønh vieân Chæ ñònh truy caäp cuûa lôùp Quyeàn truy caäp cuûa lôùp trong lôùp cô sôû daãn xuaát daãn xuaát Public Public ? Private ? Protected ? Private Public ? Private ? Protected ? Protected Public ? Private ? Protected ? 2. Trong baøi taäp II/ 1. chöông 6, neáu a vaø b beân trong lôùp mybase ñöôïc thöïc hieän trôû thaønh nhöõng thaønh vieân ñöôïc baûo veä thay vì caùc thaønh vieân rieâng (theo maëc ñònh) thì keát quaû theá naøo ? Taïi sao ?
  19. 181 Chöông 6 Tính keá thöøa IV/ Haøm taïo, haøm huûy vaø tính keá thöøa Lôùp cô sôû, lôùp daãn xuaát hoaëc caû hai coù theå coù caùc haøm taïo vaø/hoaëc haøm huûy. • Khi caû lôùp cô sôû laãn lôùp daãn xuaát coù caùc haøm taïo vaø haøm huûy, caùc haøm taïo ñöôïc thi haønh theo thöù töï daãn xuaát. Caùùc haøm huûy ñöôïc thi haønh theo thöù töï ngöôïc laïi. Cuù phaùp truyeàn ñoái soá töø lôùp daãn xuaát ñeán lôùp cô sôû : derived_constructor(arg_list) : base(arg_list) { // body of derived class constructor } Ví duï 4.1 #include class base { public: base() { cout
  20. 182 Chöông 6 Tính keá thöøa Constructing base class Constructing derived class Destructing derived class Destructing base class Ví duï 4.2 Truyeàn moät ñoái soá cho haøm taïo cuûa lôùp daãn xuaát #include class base { public: base() { cout
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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