Ok, điều này thực sự rất khó để thú nhận, nhưng tôi có một sự cám dỗ mạnh mẽ vào lúc này để thừa hưởng từ std::vector
.
Tôi cần khoảng 10 thuật toán tùy chỉnh cho vectơ và tôi muốn chúng là thành viên trực tiếp của vectơ. Nhưng tự nhiên tôi cũng muốn có phần còn lại của std::vector
giao diện. Chà, ý tưởng đầu tiên của tôi, với tư cách là một công dân tuân thủ luật pháp, là có một std::vector
thành viên trong MyVector
lớp. Nhưng sau đó tôi sẽ phải tự phê duyệt lại tất cả giao diện của std :: vector. Quá nhiều để gõ. Tiếp theo, tôi nghĩ về thừa kế riêng tư, vì vậy thay vì phê duyệt các phương pháp, tôi sẽ viết một loạt các using std::vector::member
phần trong phần công khai. Điều này là tẻ nhạt quá thực sự.
Và tôi ở đây, tôi thực sự nghĩ rằng tôi chỉ có thể kế thừa công khai từ đó std::vector
, nhưng đưa ra một cảnh báo trong tài liệu rằng lớp này không nên được sử dụng đa hình. Tôi nghĩ rằng hầu hết các nhà phát triển đủ khả năng để hiểu rằng điều này không nên được sử dụng đa hình.
Là quyết định của tôi hoàn toàn bất công? Nếu vậy, tại sao? Bạn có thể cung cấp một giải pháp thay thế có các thành viên bổ sung thực sự là thành viên nhưng sẽ không liên quan đến việc gõ lại tất cả giao diện của vectơ không? Tôi nghi ngờ điều đó, nhưng nếu bạn có thể, tôi sẽ hạnh phúc.
Ngoài ra, ngoài việc một số kẻ ngốc có thể viết một cái gì đó như
std::vector<int>* p = new MyVector
Có bất kỳ nguy hiểm thực tế nào khác khi sử dụng MyVector không? Bằng cách nói thực tế, tôi loại bỏ những thứ như tưởng tượng một hàm đưa con trỏ đến vectơ ...
Vâng, tôi đã nêu trường hợp của tôi. Tôi từng phạm tội. Bây giờ tùy bạn tha thứ cho tôi hay không :)
std::vector
Giao diện của nó khá lớn và khi C ++ 1x xuất hiện, nó sẽ mở rộng rất nhiều. Đó là rất nhiều để gõ và nhiều hơn nữa để mở rộng trong một vài năm. Tôi nghĩ rằng đây là một lý do tốt để xem xét thừa kế thay vì ngăn chặn - nếu ai đó tuân theo tiền đề rằng các chức năng đó phải là thành viên (mà tôi nghi ngờ). Nguyên tắc để không xuất phát từ các thùng chứa STL là chúng không đa hình. Nếu bạn không sử dụng chúng theo cách đó, nó sẽ không áp dụng.