Cách xác định kiểu dữ liệu của đối tượng trong đa hình, phục vụ việc xử lí các truy vấn yêu cầu riêng của đề bài.
Nội dung bài viết
1. Xác định dữ liệu bằng hàm dynamic_cast
Giả sử bạn có cây kế thừa như sau:
Bạn muốn xây dựng mảng để quản lí các loại gia súc trên, bạn sử dụng liên kết động trong đa hình.
Bạn dễ dàng nhập, xuất… thông qua các hàm virtual, và khởi tạo vào mảng bằng cách sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Cattle *DsCattle[10000]; ............... cout << "So luong Cow : "; cin >> nCow; cout << "So luong Sheep : "; cin >> nSheep; cout << "So luong Goat : "; cin >> nGoat; SoLuong = 0; for (int i = 0; i < nCow; i++) DsCattle[SoLuong++] = new Cow(); for (int i = 0; i < nSheep; i++) DsCattle[SoLuong++] = new Sheep(); for (int i = 0; i < nGoat; i++) DsCattle[SoLuong++] = new Goat(); ..... |
Tuy nhiên sau khi đã xây dựng xong mảng, nếu bạn muốn biết khi bạn truy xuất vào từng đối tượng DsCattle[i] trên là kiểu dữ liệu Cow, Sheep, hay Goat, thì bạn có thể dùng lệnh sau để kiểm tra:
1 2 3 4 | if (dynamic_cast<Cow*>(DsCattle[i]) != NULL) { ..... } |
Câu lệnh trên kiểm tra đối tượng DsCattle[i] có phải kiểu Cow không, nếu phải thì (dynamic_cast<Cow*>(DsCattle[i]) sẽ trả về địa chỉ khác NULL.
Đây chỉ là một ví dụ, bạn có thể đọc thêm về cách xác định kiểu dữ liệu trong đa hình tại đây: http://stackoverflow.com/questions/19501838/get-derived-type-via-base-class-virtual-function
2. Xác định dữ liệu bằng cách tạo thêm hàm
Giả sử trong ví dụ bên trên bạn muốn tìm xác định con bò nào sinh được lượng sữa là 10. Bạn có thể tạo thêm một hàm bool isCowMilk10() hàm này trong các class Sheep và Goat bạn có thể return false, còn trong hàm của Cow bạn đặt điều kiện nếu milk = 10 thì return true.
Đó là một trong những cách xử lí trong tình huống này để xác định kiểu dữ liệu trong đa hình.
Bài viết liên quan
- [Học OOP] Bài 2: Tổng quan về lập trình hướng đối tượng
- Giải đề thi Lập trình hướng đối tượng UIT – Đề HK2 2016-2017
- [BT Lập trình hướng đối tượng – OOP] Class mảng căn bản
- [Lập trình hướng đối tượng – OOP] Bài tập cơ bản về lớp (class) – Thực hành 2
- [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)
- [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 7: Overload toán tử trong Lập trình 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 5: Static trong hướng đối tượng c++
- [Học OOP] Bài 4: Constructor, destructor và Copy constructor trong hướng đối tượng c++