Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 36 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
36
Dung lượng
182,74 KB
Nội dung
Chơng kế thừa Chơng trình bày vấn đề sau: Đơn kế thừa, đa kế thừa Hàm tạo hàm hủy kế thừa Hàm ảo, lớp sở ảo 5.1 Giới thiệu Kế thừa l khái niệm sở phơng pháp lập trình hớng đối tợng Tính kế thừa cho phép định nghĩa lớp từ lớp đà có Mét líp cã thĨ lμ líp c¬ së cho nhiỊu líp dÉn xt kh¸c Líp dÉn xt sÏ kÕ thừa số thnh phần (dữ liệu v hm) lớp sở, đồng thời có thêm thnh phần Có hai loại kế thừa l: đơn kế thừa v đa kế thừa, minh họa qua hình vẽ sau đây: A B Hình 5.1 Đơn kế thõa, líp A lμ líp c¬ së cđa líp B A A A C B B C (a) B C D (b) D (c) Hình 5.2 Đa kế thừa Hình (a): Líp A lμ líp c¬ së cđa líp B, lớp B l lớp sở lớp C Hình (b): Lớp A l lớp sở lớp B, C, D H×nh (c): Líp A, B, C lμ lớp sở lớp D 5.2 Đơn kế thừa Lp trỡnh HT 93 http://www.ebook.edu.vn 5.2.1 Định nghĩa lớp dẫn xuất từ lớp sở Giả sử đà định nghĩa lớp A Cú pháp để xây dựng lớp B dÉn xuÊt tõ líp A nh− sau: class B: mode A { private: // Khai b¸o c¸c thc tÝnh cđa lớp B public: // Định nghĩa hm thnh phần cđa líp B }; Trong ®ã mode cã thĨ lμ private hc public víi ý nghÜa nh− sau: - KÕ thừa theo kiểu public tất thnh phần public lớp sở l thnh phần public cđa líp dÉn xt - KÕ thõa theo kiĨu private tất thnh phần public lớp sở trở thnh thnh phần private lớp dẫn xuất Chú ý: Trong hai trờng hợp thnh phần private lớp sở l không đợc kế thừa Nh lớp dẫn xuất không cho phép truy nhập đến thnh phần private lớp sở 5.2.2 Truy nhập thành phần líp dÉn xt Thμnh phÇn cđa líp dÉn xt bao gồm: thnh phần khai báo lớp dẫn xuất v thnh phần m lớp dẫn xuất thừa kế từ lớp sở Quy tắc sử dụng thnh phần lớp dẫn xuất đợc thực theo theo mẫu nh sau: Tên đối tợng.Tên_lớp::Tên_thnh_phần Khi chơng trình dịch C++ dễ dng phân biệt thnh phần thuộc lớp no Ví dụ 5.1 Giả sử có líp A vμ B nh− sau: class A { public: int n; void nhap() { coutn; } }; Lập trình HĐT 94 http://www.ebook.edu.vn class B: public A { public: int m; void nhap() { coutm; } }; XÐt khai b¸o: B ob; Lóc ®ã: ob.B::m lμ thc tÝnh n khai b¸o B ob.A::n lμ thuéc tÝnh n thõa kÕ từ lớp A ob.D::nhap() l hm nhap() định nghĩa lớp B ob.A::nhap() l hm nhap() định nghĩa lớp A Chú ý: Để sử dụng thnh phần lớp dẫn xuất, không dùng tên lớp, dùng tên thnh phần Khi chơng trình dịch phải tự phán đoán để biết thnh phần thuộc lớp no: trớc tiên xem thnh phần xét có trùng tên với thnh phần no lớp dẫn xuất không? Nếu trùng thnh phần lớp dẫn xuất Nếu không trùng tiếp tục xét lớp sở theo thứ tự: lớp có quan hệ gần với lớp dẫn xuất đợc xét trớc, líp quan hƯ xa h¬n xÐt sau Chó ý tr−êng hợp thnh phần xét có mặt đồng thời lớp sở có đẳng cấp quan hệ với lớp dẫn xuất Trờng hợp ny chơng trình dịch định đợc thnh phần ny thừa kế từ lớp no v đa thông báo lỗi 5.2.3 Định nghĩa lại hàm thành phần cđa líp c¬ së líp dÉn xt Trong líp dẫn xuất định nghĩa lại hm thnh phần lớp sở Nh có hai phiên khác hm thnh phần lớp dẫn xuất Trong phạm vi lớp dẫn xuất, hm định nghĩa lại che khuất hm đợc định nghĩa Việc sử dụng hm no cần tuân theo quy định Chú ý: Việc định nghĩa lại hm thnh phần khác với định nghĩa hm tải Hm định nghĩa lại v hm bị định nghĩa lại giống tên, tham số v giá trị trả Chúng khác vị trí: hm đặt lớp dẫn xuất v hm lớp sở Trong đó, hm tải có tên, nhng kh¸c Lập trình HĐT 95 http://www.ebook.edu.vn vỊ danh s¸ch tham sè vμ tÊt c¶ chóng thc cïng mét líp Định nghĩa lại hm thnh phần l sở cho việc xây dựng tính đa hình hm C++ cho phép đặt trùng tên thuộc tính lớp sở v lớp dẫn xuất Các thnh phần tên ny kiểu hay khác kiểu Lúc ny bên đối tợng lớp dẫn xuất có tới hai thnh phần khác có tên, nhng phạm vi lớp dẫn xuất, tên chung nhằm định thnh phần đợc khai báo lại lớp dẫn xuất Khi muốn định thnh phần trùng tên lớp sở phải dùng tên lớp toán tử :: đặt trớc tên hm thnh phần Ví dụ 5.2 Xét lớp A v B đợc xây dựng nh− sau: class A { private: int a, b, c; public: void nhap() { couta; coutb; coutc; } void hienthi() { cout