Đầu tiên, "STL" không phải là một thuật ngữ chính thức, nó là tên của thư viện được đề xuất để đưa vào Thư viện chuẩn C ++ khi không có thùng chứa. Nó cung cấp về cơ bản các mẫu container và thuật toán.
Bây giờ, các mẫu container và thuật toán này là ... các mẫu để chúng tạo ra các loại khi cần thiết. Họ không dựa vào sự kế thừa từ quan điểm của người dùng.
Tuy nhiên, thư viện tiêu chuẩn chỉ định về cơ bản giao diện của thư viện, không phải việc thực hiện. Rất nhiều triển khai STL sẽ sử dụng một chút định hướng đối tượng khi triển khai nhưng với tư cách là người dùng, bạn sẽ không thấy nó nếu bạn không đi sâu vào mã nguồn triển khai của mình (phải được trình bày vì về cơ bản là mã mẫu).
Tôi đã học được rằng hàm thành viên ảo điều chỉnh OO trái ngược với khuôn mẫu, điều này có đúng không?
Không, chúng là những khái niệm trực giao cung cấp những lợi thế và nhược điểm rất khác nhau. Trong thực tế trong C ++, một trong những lợi thế chính để sử dụng ngôn ngữ như vậy là bạn có cả khả dụng và sử dụng một ngôn ngữ không hủy bằng ngôn ngữ kia. Nó thậm chí là một lợi thế rất lớn. Ví dụ, một trong những thành ngữ thú vị nhất trong C ++ là CRTP sử dụng cả mẫu và kế thừa. Ý tưởng là phần kế thừa cho phép bạn mở rộng một số loại với một hành vi và dữ liệu chung, như một lớp cơ sở; trong khi phần mẫu đảm bảo tạo các lớp cơ sở cụ thể cho từng đứa trẻ, không thể có một con trỏ tới tất cả các lớp sử dụng lớp CRTP làm cơ sở. Điều này cực kỳ hữu ích và không cho phép gây rối với quyền thừa kế ở những nơi không nên có.
Tôi cũng đã triển khai các hệ thống gửi sự kiện rất chung chung không biết loại sự kiện hoặc loại người nghe nhưng kết hợp mã động và mã tĩnh bên trong cùng nhau cho phép tạo ra các loại nội bộ phù hợp với các loại thời gian chạy phù hợp.
Và đó là điểm chính: bạn không phải lúc nào cũng cần "hướng đối tượng". Trong thực tế, hầu hết thời gian bạn không cần nó, bạn cần xác định một số loại và sử dụng chúng trực tiếp như một phần khác nhau của một loại công cụ trừu tượng (sáng tác). Bạn không phải lúc nào cũng cần mã chung, hay còn gọi là các mẫu. Đôi khi bạn cần nó để khái quát hóa một chức năng để áp dụng cho một số loại không liên quan. Khi chúng có liên quan, bạn có thể sử dụng lớp cơ sở của chúng thay thế và không cần mẫu.
Chúng có những lợi thế khác nhau và chi phí hoàn toàn khác nhau, vì vậy chúng rất tốt để kết hợp để giải quyết các vấn đề phức tạp.
STL là một ví dụ điển hình cho vấn đề trong đó phần lớn là về việc cung cấp các loại (thùng chứa) và các hàm (thuật toán) có liên quan đến một loại nhất định thay vì phân cấp các đối tượng thời gian chạy. Trong thư viện chuẩn, các luồng được tạo theo cách điển hình cho hướng đối tượng: đó là một hệ thống phân cấp của các lớp luồng thực hiện các việc khác nhau theo cách cho phép xác định lớp luồng phụ kết hợp các hành vi / năng lực khác nhau. Ở đó, định hướng đối tượng là hữu ích, ngay cả khi một số người thích nó giống với STL hơn (tôi không phải là chuyên gia về chủ đề này).
Vì vậy, chỉ cần nghĩ về chúng như những công cụ rất khác nhau, như một cái tuốc nơ vít và một cái búa. C ++ đừng để bạn suy nghĩ chỉ với một công cụ.