Re[3]: Расскажите, почему наследование здесь 'misused'
От: Шахтер Интернет  
Дата: 14.01.06 19:48
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А современный C++ этого не поддерживает... А мне нравится...


Мне тоже. Отсутствие внешних методов -- неприятный недостаток.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Расскажите, почему наследование здесь 'misused'
От: srggal Украина  
Дата: 16.01.06 14:56
Оценка:
Здравствуйте, _Winnie, Вы писали:

Гм, много чего люди написали, и у меня возник встречный вопрос, а можно ли эти самы функции просто вынести в char_traits, вместо того, чтобы наследоваться от std::string ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Расскажите, почему наследование здесь 'misused'
От: igna Россия  
Дата: 16.01.06 18:17
Оценка:
Здравствуйте, _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.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.