[Buổi 29][Đa hình][WS] Bài 1: Polymorphic Payroll
Polymorphic Payroll
Bối cảnh
Hệ thống payroll có Employee trừu tượng; FullTime và PartTime tính pay khác nhau.
Workshop dùng một collection base pointer để xử lý nhiều derived object thống nhất.
Yêu cầu
- Employee có id, pure virtual
pay()và virtual destructor. - FullTime pay = salary.
- PartTime pay = hours*rate.
- Đọc n record FT/PT, lưu
Employee*, inid payvà tổng payroll; cleanup cuối.
Yêu cầu tổ chức code
Phải dùng collection base pointer/reference với virtual pay().
Online Judge chấm output. Với bài nhạy về cấu trúc OOP, giảng viên review thêm source code để xác nhận học viên luyện đúng kỹ năng.
Input
Dòng 1 n; FT: FT id salary; PT: PT id hours rate.
Output
n dòng; cuối TOTAL sum.
Ràng buộc
1≤n≤2000, các số không âm.
Ví dụ 1
Input
3
FT E1 100
PT E2 10 5
FT E3 80
Output
E1 100
E2 50
E3 80
TOTAL 230
Giải thích
FT E1 salary100 dùng implementation full-time nên pay100. PT E2 có rate10, hours5 nên pay50. FT E3 pay80. Các object được xử lý qua interface Employee nhưng virtual pay() chọn đúng derived type; tổng 100+50+80=230.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Ví dụ 2
Input
1
PT A 0 100
Output
A 0
TOTAL 0
Giải thích
PT A có rate0 và hours100 nên pay0. Dù hours lớn, công thức derived vẫn trả0; tổng payroll0. Output A 0 và TOTAL 0 kiểm tra behavior polymorphic ở giá trị biên.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Thông tin học tập
- Module: M08
- Buổi: B29
- Loại bài: WORKSHOP
- Độ khó: Medium
- Concepts: abstract class, virtual pay, override, heterogeneous collection, virtual destructor
- Giới hạn kiến thức: B01-B29
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments