Гаразд, це визнати насправді важко, але у мене зараз сильна спокуса успадкувати std::vector
.
Мені потрібно близько 10 налаштованих алгоритмів для вектора, і я хочу, щоб вони були безпосередньо членами вектора. Але, природно, я хочу також мати інший std::vector
інтерфейс. Ну, моя перша ідея як законослухняного громадянина полягала в тому, щоб мати std::vector
члена в MyVector
класі. Але тоді мені доведеться вручну переробити весь інтерфейс std :: vector. Занадто багато набирати. Далі я подумав про приватне успадкування, так що замість того, щоб переосмислити методи, я напишу купу using std::vector::member
's у публічний розділ. Це теж нудно насправді.
І ось я, я дійсно думаю, що я можу просто успадкувати публічно std::vector
, але надаю попередження в документації про те, що цей клас не слід використовувати поліморфно. Я думаю, що більшість розробників достатньо компетентні, щоб зрозуміти, що це не слід використовувати поліморфно.
Чи моє рішення абсолютно невиправдане? Якщо так, то чому? Чи можете ви надати альтернативу, яка б містила додаткових членів насправді членів, але не передбачала б переформатування всього інтерфейсу вектора? Я сумніваюся в цьому, але якщо зможете, я просто буду щаслива.
Також, крім того, що якийсь ідіот може написати щось подібне
std::vector<int>* p = new MyVector
чи є якісь інші реалістичні загрози використання MyVector? Говорячи реалістично, я відкидаю такі речі, як уявіть собі функцію, яка бере покажчик на вектор ...
Ну, я заявив про свою справу. Я згрішив. Тепер саме вам пробачити мене чи ні :)
std::vector
'є досить величезним, і коли C ++ 1x з'явиться, він значно розшириться. Це багато чого набрати, а ще більше розширитись через кілька років. Я думаю, що це вагомий привід розглянути спадщину замість стримування - якщо дотримуватися передумови, що ці функції мають бути членами (в чому я сумніваюся). Правило не отримувати з контейнерів STL полягає в тому, що вони не є поліморфними. Якщо ви не використовуєте їх таким чином, це не застосовується.