Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa
Kế thừa cho phép định nghĩa một lớp mới từ một lớp khác
nhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm của
lớp cũ thay vì phải viết mới hoàn toàn
Một lớp được kế thừa từ lớp khác được gọi là lớp dẫn xuất,
hoặc lớp con
Lớp cho phép việc kế thừa gọi là lớp cơ sở hoặc lớp cha
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất
Một lớp có thể kế thừa từ một hoặc nhiều lớp cơ sở
Hàm dựng và hàm hủy không được phép kế thừa cho các lớp
dẫn xuất
Con trỏ của lớp cơ sở có thể chứa được địa chỉ của các đối
tượng của lớp dẫn xuất
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa
5/18/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngôn ngữ lập trình C và C++ Bài 7: Kế thừa và Đa xạ TS. Đỗ Đăng Khoa Bộ môn Cơ học Ứng dụng Viện Cơ khí 5/18/2015 2 Khái niệm về Kế thừa Kế thừa cho phép định nghĩa một lớp mới từ một lớp khác nhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm của lớp cũ thay vì phải viết mới hoàn toàn Một lớp được kế thừa từ lớp khác được gọi là lớp dẫn xuất, hoặc lớp con Lớp cho phép việc kế thừa gọi là lớp cơ sở hoặc lớp cha TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất Một lớp có thể kế thừa từ một hoặc nhiều lớp cơ sở Hàm dựng và hàm hủy không được phép kế thừa cho các lớp dẫn xuất Con trỏ của lớp cơ sở có thể chứa được địa chỉ của các đối tượng của lớp dẫn xuất 5/18/2015 3 Khái niệm về Kế thừa Lớp kế thừa mặc nhiên có thể sử dụng một phần hoặc toàn bộ các thành phần của lớp cơ sở Tuỳ thuộc vào kiểu kế thừa. Có 3 kiểu kế thừa: public, protected và private Ví dụ về kế thừa: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 5/18/2015 4 Khai báo lớp kế thừa đơn Cú pháp: class derived-class: access-specifier base-class Trong đó: derived-class: Tên lớp mới access-specifier: Kiểu kế thừa là public, protected hoặc private TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI base-class: Tên lớp đã có. Nếu access-specifier không sử dụng, thì mặc định là kế thừa private. 5/18/2015 5 Khai báo lớp kế thừa đơn Ví dụ: Lớp cơ sở Shape, và lớp dẫn xuất Rectangle. #include using namespace std; // Base class class Shape{ public: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI void setWidth(int w){ width = w; } void setHeight(int h){ height = h; } 5/18/2015 6 Khai báo lớp kế thừa đơn protected: int width; int height; }; // Derived class class Rectangle: public Shape{ TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI public: int getArea(){ return (width * height); } }; 5/18/2015 7 Khai báo lớp kế thừa đơn int main(void){ Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI // Print the area of the object. cout << "Total area: " << Rect.getArea() << endl; return 0; } 5/18/2015 8 Quyền truy cập Lớp dẫn xuất có thể truy cập tất cả các thành phần không phải private Bảng tổng hợp các quyền truy cập TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 5/18/2015 9 Kiểu kế thừa Khi dẫn xuất một lớp từ lớp cơ sở, lớp cơ sở có thể được kế thừa theo public, protected và private Kế thừa public: tất cả thành phần public, protected của lớp cơ sở sẽ là thành phần public, protected tương ứng của lớp dẫn xuất. Các thành phần private của lớp cơ sở không truy cập trực tiếp từ lớp dẫn xuất, nhưng có thể truy cập bằng cách gọi các TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI thành phần public và protected của lớp cơ sở. Kế thừa protected: Các thành phần public, protected của lớp cơ sở sẽ là thành phần protected của lớp dẫn xuất. Kế thừa private: Các thành phần public, protected của lớp cơ sở sẽ là thành phần private của lớp dẫn xuất 5/18/2015 10 Đa kế thừa Một lớp có thể kế thừa các thành phần từ nhiều lớp cơ sở, được khai báo như sau: class derived-class: access baseA, access baseB... access: là public, protected hoặc private. Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI #include using namespace std; // Base class Shape class Shape{ public: 5/18/2015 11 Đa kế thừa void setWidth(int w) { width = w; } void setHeight(int h) { TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI height = h; } protected: int width; int height; }; 5/18/2015 12 Đa kế thừa // Base class PaintCost class PaintCost { public: int getCost(int area) { TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI return area * 70; } }; 5/18/2015 13 Đa kế thừa // Derived class class Rectangle: public Shape, public PaintCost { public: int getArea() { TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI return (width * height); } }; 5/18/2015 14 Đa kế thừa int main(void){ Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // Print the area of the object. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI cout << "Total area: " << Rect.getArea() << endl; // Print the total cost of painting cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; } 5/18/2015 15 Đa xạ (polymorphism) Đa xạ thường xảy ra khi có một hệ thống phân cấp các lớp và chúng có liên quan bởi việc kế thừa. Đa xạ có nghĩa là việc gọi tới một hàm thành phần sẽ làm cho làm cho một hàm khác được thực hiện tùy thuộc vào kiểu của đối tượng đó gọi hàm. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 5/18/2015 16 Đa xạ (polymorphism) #include using namespace std; class Shape { protected: int width, height; public: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Shape( int a=0, int b=0) { width = a; height = b; } 5/18/2015 17 Đa xạ (polymorphism) int area(){ cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI public: Rectangle( int a=0, int b=0):Shape(a, b) { } int area (){ cout << "Rectangle class area :" <<endl; return (width * height); }}; 5/18/2015 18 Đa xạ (polymorphism) class Triangle: public Shape{ public: Triangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI return (width * height / 2); } }; 5/18/2015 19 Đa xạ (polymorphism) // Main function for the program int main( ){ Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // store the address of Rectangle TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI shape = &rec; // call rectangle area. shape->area(); // store the address of Triangle shape = &tri; // call triangle area. 5/18/2015 20 Đa xạ (polymorphism) shape->area(); return 0;} Kết quả in ra: Parent class area Parent class area Hàm area() được thiết lập một lần bởi trình biên dịch là hàm của TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI lớp cơ sở. Đây được gọi là liên kết tĩnh – hàm gọi được đã xác định trước khi chương trình thực hiện Để giải quyết vấn đề, bổ sung thêm từ khóa virtual trước hàm area của lớp Shape: virtual int area() 5/18/2015 21 Đa xạ (polymorphism) Kết quả in ra: Rectangle class area Triangle class area Với từ khóa virtual, trình biên dịch tìm kiếm nội dung của con trỏ thay vì kiểu của nó. Do đó, từ lúc địa chỉ của các lớp Triangle và Rectangle được chứa trong *shape, hàm area tương ứng sẽ TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI được gọi. Chúng ta có các lớp với một hàm tên giống nhau, thậm chí cùng tham số, nhưng được triển khai khác nhau. Đây là cách đa xạ thường được dùng 5/18/2015 22 Hàm ảo (Virtual Function) Hàm ảo là hàm trong lớp cơ sở được khai báo sử dụng từ khóa virtual Việc định nghĩa một hàm ảo trong lớp cơ sở, một hàm tương tự trong lớp dẫn xuất nhằm nói với trình biên dịch hàm này không được liên kết tĩnh mà là liên kết động. Hàm ảo không dùng cho hàm dựng nhưng có dùng cho hàm TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI hủy 5/18/2015 23 Hàm thuần ảo Hàm thuần ảo được khai báo như sau: virtual kiểu tên_hàm() = 0; Hàm thuần ảo không có thân hàm Khai báo hàm thuần ảo trong lớp cơ sở nhằm yêu cầu các lớp dẫn xuất từ lớp này bắt buộc phải có phần triển khai riêng hàm đó. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
File đính kèm:
- bai_giang_ngon_ngu_lap_trinh_c_va_c_bai_7_ke_thua_va_da_xa_d.pdf