Tính kế thừa – Inheritance [C++ OOP]

Tính kế thừa – Inheritance [C++ OOP]

Kế thừa là gì?

  • Tính kế thừa (Inheritance) là một trong bốn tính chất cơ bản của Lập trình hướng đối tượng (OOP).
  • Kế thừa có thể được định nghĩa là quá trình mà một lớp (class) có được các thuộc tính của một lớp khác. Các thuộc tính đó có thể là một phương thức (method) hoặc một trường (field) nào đó. Có nghĩa là nếu lớp A kế thừa lớp B thì lớp A sẽ có những thuộc tính và phương thức của lớp B.
  • Lớp được thừa hưởng những thuộc tính và phương thức từ lớp khác được gọi là dẫn xuất (Derived Class) hay lớp Con (Subclass) và các lớp bị lớp khác kế thừa được gọi là lớp cơ sở (Base Class) hoặc lớp cha (Parent Class).

Cú pháp kế thừa

6Em9crRKpncLAstWY2Z2bQZfwt ERW0Sck jghXSFbpcKJxvyDbN94we3Yf8c0kLHreuGstaVmMTX3cptUJnE1vGYRS3wA - quochung.cyou PTIT

Đơn kế thừa, đa kế thừa

Đơn kế thừa

  • Đơn kế thừa (single inheritance) là một class con kế thừa duy nhất từ một class cha. Ví dụ như class sinh viên chỉ kế thừa duy nhất từ class con người.

Khai báo:

w8VoTdRWgs3vjKMRb973p jC ZkXSiEhdOBSacDB8MS9VCMKTRoQgb 3w4ggLcaWfAiUFewo8I5kMtt3kAA DoUTHSqXjtDpWRgWTIBhLLew bVryXWGIh8iEhsiF0IDApB U WLVE - quochung.cyou PTIT

Tính chất dẫn xuất trong đơn kế thừa

Lớp dẫn xuấtLớp dẫn xuấtLớp dẫn xuất
Lớp cơ sởPublicPrivateProtected
PrivateKhông kế thừaKhông kế thừaKhông kế thừa
ProtectedProtectedPrivateProtected
PublicPublicPrivateProtected
  • public: Nếu kế thừa ở dạng này, sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ public ở lớp con, dạng protected ở lớp cha vẫn sẽ là protected ở lớp con.
  • protected: Nếu dùng protected thì sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ trở thành protected tại lớp con.
  • private: Trường hợp ta sử dụng private, thì sau khi kế thừa, tất cả các thành viên dạng public và protected ở lớp cha sẽ thành private tại lớp con.

Đa kế thừa

  • Đa kế thừa (multiple inheritance) nghĩa là thay vì một class dẫn xuất kế thừa từ một class cơ sở, class dẫn xuất này có thể có kế thừa từ nhiều class cơ sở khác nhau. Ví dụ như con cái thì sẽ kế thừa đặc điểm từ cả bố và mẹ của chúng.

Khai báo:

p7jnwzKx8OTXleC1sNzeAfsA41V19Q4Lo GOHqrzDGN9kbth2XZyeMQDyhWrSkaqO zTLzh0Wc NFEcKg HWhMqr9jsI r9geXyEOjP0FnYhHZ MDYPXaXGsST7UytG7oU1b8W5yNlXV - quochung.cyou PTIT
  • Khi thừa kế từ nhiều class cơ sở, bạn thấy sẽ có một vấn đề phát sinh chính là khi lớp cơ sở có phương thức trùng tên, khi gọi phương thức sẽ xảy ra sự mơ hồ. Sự mơ hồ nghĩa là trình biên dịch không biết bạn đang gọi phương thức từ class dẫn xuất nào. Để giải quyết vấn đề này, ta có thể sử dụng toán tử phạm vi :: để chỉ rõ phương thức ở class nào. Ví dụ:
6LY VpYtPOiVZa5X62k5a21IgZF0z RbLRqRYW nD4H7nHvSPDvVieoemMZtnmVkKhKqv7dNyMf5AZOXhysn - quochung.cyou PTIT

Function Overloading & Operator Overloading

  • Ngôn ngữ C++ cho phép xác định nhiều hơn một định nghĩa cho một tên hàm hoặc một toán tử trong cùng phạm vi, được gọi tương ứng là Nạp chồng hàm và Nạp chồng toán tử.
  • Một khai báo nạp chồng là một khai báo mà đã được khai báo cùng tên như một khai báo được khai báo trước đó trong cùng phạm vi, ngoại trừ rằng: cả hai khai báo có các tham số khác nhau và định nghĩa khác nhau

Nạp chồng hàm

  • Kỹ thuật này cho phép sử dụng cùng một tên gọi cho các hàm “giống nhau” (có cùng mục đích). Nhưng khác nhau về kiểu dữ liệu tham số hoặc số lượng tham số.
  • Ví dụ: Nạp chồng hàm cho phép ta khai báo và định nghĩa các hàm sau với cùng một tên gọi.
tYUerjOrMqnd4LwQawL7weM2TMV1 efVoirK6BCawbTGbNbrDFFX7u0WcxYT NcQCnn0G1VHHXn7CuZU4P8ykm3WL TBGd ESMMmlmN61dEKqbpE6GbmU2VNrl4ZJ kM7o3IlRn ToZ2 - quochung.cyou PTIT

Nạp chồng toán tử

  • .Nạp chồng toán tử (overload operator) là bạn định nghĩa lại toán tử đã có trên kiểu dữ liệu người dùng tự định nghĩa để dể dàng thể hiện các câu lệnh trong chương trình.
  • Ví dụ như bạn định nghĩa phép cộng cho kiểu dữ liệu phân số thì sẽ thực hiện cộng hai phân số rồi trả về một phân số mới. So với việc thực hiện gọi hàm, việc overload toán tử sẽ làm cho câu lệnh ngắn gọn, dễ hiểu hơn.
XjTsX IbJE9IzgP5NGytA763YIqjQffZljq53jqA znKHiJloMouE1UsO4nfhSHOnWc3q2MIyzYoWHBVkgZCavfVoSp Aofx6bbHdlzfSTA1VGuM0M8V2ig6X89ArKN zBd5My8BmKpw - quochung.cyou PTIT

Cú pháp:

=> Như đã giới thiệu, bản chất việc dùng toán tử là lời gọi hàm, do đó chúng ta overload toán tử cũng giống overload hàm, vậy chúng ta sẽ overload hàm nào? Chúng ta sẽ overload hàm có tên là operator @, với @ là toán tử cần overload (+, -, *, /…), kiểu trả về của hàm chính là lớp đó.

Nạp chồng toán tử 2 ngôi:

BQ1NHTILv 0aXq0Ha9tsVX88OBxh70XHLdYkO3sBFS8w7FRJ 0oD4jFagxDUI1336PbZF88rPajtgOGMYanSItSKRFtOz1ghoLz9mtCaB2YzwO1GROk7qh4D8 Nbj2SunNMe oQZDIDD - quochung.cyou PTIT

Function Overriding

  • Trong kế thừa, khi lớp con khai báo phương thức có tên trùng với phương thức ở lớp cha thì phương thức của lớp cha sẽ bị thay thế bởi phương thức ở lớp con.
- quochung.cyou PTIT

Hàm Friend

  • Hàm bạn của một lớp không phải là hàm thành viên nên nó không phụ thuộc vào lớp và có thể định nghĩa ở trong hoặc ngoài lớp. 
  • Hàm bạn có thể truy cập trực tiếp các thành viên private và một lớp có thể có nhiều hàm bạn.
  • Cú pháp khai báo hàm bạn đơn giản là thêm từ khóa friend trước hàm bình thường ta vẫn sử dụng.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply