Здравствуйте, _Winnie, Вы писали:
Гм, много чего люди написали, и у меня возник встречный вопрос, а можно ли эти самы функции просто вынести в char_traits, вместо того, чтобы наследоваться от std::string ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, _Winnie, Вы писали:
__W>какие причины есть считать это злом? Нутром чую, что это путь в ад, но пока не вижу конкретных плохих вещей.
Вот случай, в котором такое public наследование на мой взгляд вполне оправдано:
Стандартный basic_string не позволяет присваивать друг другу объекты с разными типами аллокаторов, то есть не проходит вот такое:
basic_string<char, char_traits<char>, allocator<char> > s;
basic_string<char, char_traits<char>, my_allocator<char> > my_s;
my_s = s; // ошибка
Ничего умного в таком поведении basic_string не вижу, скорее всего просто при написании стандарта получилось как получилось, вот и вся причина. Конечно можно использовать c_str(), но тогда не применишь стандартные алгоритмы требующие присваивания или конструктора "копирования".
Когда мне понадобилось присваивать друг другу строки с разными типами аллокаторов, я определил свой, скажем, my_basic_string произведя его от basic_string с модификатором доступа public и добавив или переопределив десяток функций. С агрегацией мороки было бы заметно больше, кроме того ссылку на my_basic_string нельзя было передавать какой-либо (ранее написаной) функции принимающей ссылку на basic_string.