Tính kế thừa-3
Mặc dù một đối tượng lớp dẫn xuất cũng là một đối tượng lớp cơ sở, kiểu lớp dẫn xuất và kiểu lớp cơ sở thì khác nhau. Các đối tượng lớp dẫn xuất có thể được xử lý như các đối tượng lớp cơ sở. Điều này có ý nghĩa bởi vì lớp dẫn xuất có các ...
Mặc dù một đối tượng lớp dẫn xuất cũng là một đối tượng lớp cơ sở, kiểu lớp dẫn xuất và kiểu lớp cơ sở thì khác nhau. Các đối tượng lớp dẫn xuất có thể được xử lý như các đối tượng lớp cơ sở. Điều này có ý nghĩa bởi vì lớp dẫn xuất có các thành viên tương ứng với mỗi thành viên của lớp cơ sở. Phép gán theo chiều hướng ngược lại là không cho phép bởi vì gán một đối tượng lớp cơ sở cho đối tượng lớp dẫn xuất sẽ cho phép thêm các thành viên lớp dẫn xuất không xác định.
Một con trỏ trỏ tới một đối tượng lớp dẫn xuất có thể được chuyển đổi ngầm định thành một con trỏ trỏ tới một đối tượng lớp cơ sở bởi vì một đối tượng lớp dẫn xuất là một đối tượng lớp cơ sở.
Có bốn cách để trộn và đối sánh các con trỏ lớp cơ sở và các con trỏ lớp dẫn xuất với các đối tượng lớp cơ sở và các đối tượng lớp dẫn xuất:
Tham chiếu tới một đối tượng lớp cơ sở với một con trỏ lớp cơ sở thì không phức tạp.
Tham chiếu tới một đối tượng lớp dẫn xuất với một con trỏ lớp dẫn xuất thì không phức tạp.
Tham chiếu tới đối tượng lớp dẫn xuất với một con trỏ lớp cơ sở thì an toàn bởi vì đối tượng lớp dẫn xuất cũng là một đối tượng lớp cơ sở của nó. Như vậy đoạn mã chỉ có thể tham chiếu tới các thành viên lớp cơ sở. Nếu đoạn mã tham chiếu tới các thành viên lớp dẫn xuất thông qua con trỏ lớp cơ sở, trình biên dịch sẽ báo một lỗi về cú pháp.
Tham chiếu tới một đối tượng lớp cơ sở với một con trỏ lớp dẫn xuất thì có lỗi cú pháp. Đầu tiên con trỏ lớp dẫn xuất phải được ép sang con trỏ lớp cơ sở.
Chúng ta sẽ xem xét một phân cấp các lớp Point, Circle, Cylinder như hình 5.9
Hình 5.9
Ví dụ 5.5: Lớp Point và project có tên là CT5_5.PRJ (gồm các file POINT.CPP, CT5_5.CPP).
File POINT.H:
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File POINT.CPP
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File CT5_5.CPP:
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
Chúng ta chạy ví dụ 5.5, kết quả ở hình 5.10

Hình 5.10: Kết quả của ví dụ 5.5
Ví dụ 5.6: Lớp Circle và project có tên là CT5_6.PRJ (gồm các file POINT.CPP, CIRCLE.CPP, CT5_6.CPP).
File CIRCLE.H:
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File CIRCLE.CPP
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File CT5_6.CPP
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
Chúng ta chạy ví dụ 5.6, kết quả ở hình 5.11

Hình 5.11: Kết quả của ví dụ 5.6
Ví dụ 5.7: Lớp Cylinder và project có tên là CT5_7.PRJ (gồm các file POINT.CPP, CIRCLE.CPP, CYLINDR.CPP, CT5_7.CPP).
File CYLINDR.H
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File CYLINDR.CPP
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
File CT5_7.CPP
![]() |
||
![]() ![]() ![]() ![]() |
||
![]() ![]() |
||
![]() |
Chúng ta chạy ví dụ 5.7, kết quả ở hình 5.12

Hình 5.12: Kết quả của ví dụ 5.7