[OOP] Xác định kiểu dữ liệu của đối tượng trong đa hình

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.

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: dahinh

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:

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:

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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *