02/10/2018, 14:25

[Học OOP] Bài 9: Hiểu kế thừa như thế nào cho đúng trong hướng đối tượng (Phần 2)

Bài viết này là phần 9 trong 9 bài của Series Học lập trình hướng đối tượng OOP Học lập trình hướng đối tượng OOP [Học OOP] Bài 1: Các đặc điểm mới trong c++ [Học OOP] Bài 2: Tổng quan về lập trình hướng đối tượng [Học OOP] Bài 3: Lớp trong lập trình hướng đối tượng [Học OOP] ...

Bài viết này là phần 9 trong 9 bài của Series Học lập trình hướng đối tượng OOP

Học lập trình hướng đối tượng OOP
  • [Học OOP] Bài 1: Các đặc điểm mới trong c++
  • [Học OOP] Bài 2: Tổng quan về lập trình hướng đối tượng
  • [Học OOP] Bài 3: Lớp trong lập trình hướng đối tượng
  • [Học OOP] Bài 4: Constructor, destructor và Copy constructor trong hướng đối tượng c++
  • [Học OOP] Bài 5: Static trong hướng đối tượng c++
  • [Học OOP] Bài 6: Hàm bạn, lớp bạn trong hướng đối tượng c++
  • [Học OOP] Bài 7: Overload toán tử trong Lập trình hướng đối tượng c++
  • [Học OOP] Bài 8: Kế thừa trong lập trình hướng đối tượng c++ (Phần 1)
  • [Học OOP] Bài 9: Hiểu kế thừa như thế nào cho đúng trong hướng đối tượng (Phần 2)

Kế thừa trong lập trình hướng đối tượng bao gồm rất nhiều vấn đề quan trọng cần chú ý, bài viết này sẽ chú trọng đến một số lỗi hiểu sai vấn đề khi các bạn làm các bài tập dạng này.

Lấy bài tập sau đây để phân tích vấn đề:

1. Đề bài hướng đối tượng minh họa

Xây dựng lớp Học Sinh, Giáo Viên và một số class khác nếu cần. Hãy viết các hàm/phương thức phù hợp cho phép nhập xuất thông tin của các đối tượng trên. Tất nhiên phải đầy đủ các thông tin cơ bản như, họ tên, ngày sinh (Ngày sinh phải được tổ chức là một class), Học sinh phải có lớp, mã học sinh, tương tự giáo viên cũng có các thông tin phù hợp như mã GV, trình độ giảng dạy,…

Sử dụng tính kế thừa trong lập trình hướng đối tượng để giải quyết bài toán trên.

2. Phân tích bài toán

Bài toán bên trên yêu cầu chúng ta sử dụng tính kế thừa trong lập trình hướng đối tượng nên chúng ta sẽ dễ dàng nhận ra giữa giaoVien và hocSinh có những điểm chung về thuộc tính như hoten, ngaysinh,… Đây là mối quan hệ đặc biệt hóa, tổng quát hóa , trong đó giaoVien  Người, hocSinh Người. Như vậy chúng ta sẽ xây dựng thêm 1 class conNguoi để 2 class giaoVien và hocSinh kế thừa.

Chúng ta cùng theo dõi bài giải dưới đây:

File ngay.h

File conNguoi.h

File hocSinh.h

File giaoVien.h

Nhận xét

Các bạn chú ý vào file conNguoi.h những dòng mình tô màu  class conNguoi: public ngay lớp con người kế thừa lớp ngày, điều này có ổn không??? Ở class Con người, GV và HS vẫn có nhập được ngày sinh, chương trình vẫn chạy và cho kết quả chính xác, như vậy liệu có đúng không?

Câu trả lời là không, bạn có thể làm đúng kết quả nhưng hiểu sai vấn đề. Mình đưa ví dụ này vào vì trên thực tế phần lớn nhiều bạn vẫn sai ở trường hợp này.

Trong bài này mình phải hiểu rằng “class Con người có chứa ngày sinh, chứ không phải con người ngày sinh”, Như vậy với mối quan hệ quan hệ đặc biệt hóa, tổng quát hóa để xác định cái nào kế thừa, cái nào chứa thì mình cần đặt câu hỏi: Con người có chứa ngày sinh, họ tên không? Học sinh và giáo viên có là con người không? Trả lời được những câu hỏi trên sẽ giúp bạn phần nào định hình lại suy nghĩ của mình chính xác khi áp dụng kế thừa hay không.

3. Lời giải bài tập oop

Sơ đồ class bài tập mẫu về kế thừa trong hướng đối tượng

Sơ đồ class bài tập mẫu về kế thừa trong hướng đối tượng

File ngay.h

File ngay.cpp

File conNguoi.h

File conNguoi.cpp

File giaoVien.h

File giaoVien.cpp