Giáo trình C toàn tập Chương 9
Chương Thừa kế Trong thực tế hầu hết lớp kế thừa từ lớp có trước mà khơng cần định nghĩa lại hồn tồn Ví dụ xem xét lớp đặt tên RecFile đại diện cho tập tin gồm nhiều mẫu tin lớp khác đặt tên SortedRecFile đại diện cho tập tin gồm nhiều mẫu tin xếp Hai lớp có nhiều điểm chung Ví dụ, chúng có thành viên hàm giống Insert, Delete, Find, thành viên liệu giống SortedRecFile phiên đặc biệt RecFile với thuộc tính mẫu tin tổ chức theo thứ tự thêm vào Vì hầu hết hàm thành viên hai lớp giống vài hàm mà phụ thuộc vào yếu tố tập tin xếp khác Ví dụ, hàm Find khác lớp SortedRecFile nhờ vào yếu tố thuận lợi tập tin để thực tìm kiếm nhị phân thay tìm tuyến tính hàm Find lớp RecFile Với thuộc tính chia sẻ hai lớp việc định nghĩa chúng cách độc lập dài dòng Rõ ràng điều dẫn tới việc phải chép lại mã đáng kể Mã không thời gian lâu để viết mà cịn khó bảo trì hơn: thay đổi tới thuộc tính chia sẻ phải sửa đổi tới hai lớp Lập trình hướng đối tượng cung cấp kỹ thuật thuận lợi gọi thừa kế để giải vấn đề Với thừa kế lớp thừa kế thuộc tính lớp có trước Chúng ta sử dụng thừa kế để định nghĩa thay đổi lớp mà không cần định nghĩa lại lớp từ đầu Các thuộc tính chia sẻ định nghĩa lần sử dụng lại cần Trong C++ thừa kế hỗ trợ lớp dẫn xuất (derived class) Lớp dẫn xuất giống lớp gốc ngoại trừ định nghĩa dựa hay nhiều lớp có sẵn gọi lớp sở (base class) Lớp dẫn xuất chia sẻ thuộc tính chọn (các thành viên hàm hay thành viên liệu) lớp sở khơng làm chuyển đổi định nghĩa lớp sở Lớp dẫn xuất lớp sở lớp dẫn xuất khác Quan hệ thừa kế lớp chương trình gọi quan hệ cấp bậc lớp (class hierarchy) Lớp dẫn xuất gọi lớp (subclass) trở thành cấp thấp lớp sở quan hệ cấp bậc Tương tự lớp sở gọi lớp cha (superclass) từ có nhiều lớp khác dẫn xuất Chương 9: Thừa kế 148 9.1 Ví dụ minh họa Chúng ta định nghĩa hai lớp nhằm mục đích minh họa số khái niệm lập trình phần sau chương Hai lớp định nghĩa Danh sách 9.1 hỗ trợ việc tạo thư mục đối tác cá nhân Danh sách 9.1 #include #include class Contact { public: Contact(const char *name, const char *address, const char *tel); ~Contact (void); const char*Name (void) const {return name;} const char*Address(void) const {return address;} const char*Tel(void) const {return tel;} 10 friend ostream& operator