Tôi nghĩ rằng tất cả các câu trả lời trước đã mất tầm nhìn của rừng cho cây.
Java generic không giống như các mẫu ; họ sử dụng kiểu xóa , đây là một kỹ thuật động , thay vì đa hình thời gian , là kỹ thuật tĩnh . Rõ ràng là tại sao hai chiến thuật rất khác nhau này không tốt.
Thay vì cố gắng sử dụng cấu trúc thời gian biên dịch để mô phỏng thời gian chạy, hãy xem xét những gì extends
thực sự làm: theo Stack Overflow và Wikipedia , extends được sử dụng để biểu thị phân lớp.
C ++ cũng hỗ trợ phân lớp.
Bạn cũng hiển thị một lớp container, đang sử dụng kiểu xóa ở dạng chung và mở rộng để thực hiện kiểm tra kiểu. Trong C ++, bạn phải tự thực hiện loại máy xóa, rất đơn giản: tạo một con trỏ tới siêu lớp.
Chúng ta hãy bọc nó thành một typedef, để dễ sử dụng hơn là tạo cả một lớp, et voila:
typedef std::list<superclass*> subclasses_of_superclass_only_list;
Ví dụ:
class Shape { };
class Triangle : public Shape { };
typedef std::list<Shape*> only_shapes_list;
only_shapes_list shapes;
shapes.push_back(new Triangle()); // Works, triangle is kind of shape
shapes.push_back(new int(30)); // Error, int's are not shapes
Bây giờ, có vẻ như List là một giao diện, đại diện cho một bộ sưu tập. Một giao diện trong C ++ sẽ chỉ là một lớp trừu tượng, nghĩa là một lớp không thực hiện gì ngoài các phương thức ảo thuần túy. Sử dụng phương pháp này, bạn có thể dễ dàng triển khai ví dụ java của mình trong C ++, mà không cần bất kỳ khái niệm hoặc chuyên môn mẫu nào. Nó cũng sẽ hoạt động chậm như các tổng quát kiểu Java do tra cứu bảng ảo, nhưng điều này thường có thể là một mất mát chấp nhận được.