std::basic_ios
имеет открытый конструктор :
explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
IMO, единственная причина, по которой у класса есть открытый конструктор, - это использование автономного экземпляра этого класса в программе. Если класс существует только для того, чтобы другие классы происходили от него (как, кажется, имеет место basic_ios
), все конструкторы класса должны быть protected
. Все конструкторы std::ios_base
защищены. Но, по какой-то причине, разработчики стандарта сделали этот конструктор basic_ios
публичным.
basic_ios
используется в качестве базового класса для нескольких типов потоков, и я не могу представить вариант использования, в котором у вас был бы класс, который по крайней мере не был бы basic_istream
или basic_ostream
. Есть один?
источник
basic_ios
ctor take abasic_streambuf*
был публичным еще до того, как вы смогли это сделатьusing B::B;
. Я ожидаю, что в старых реализациях был прокси-ctor:A(int x) : B(x) {}
- который работает нормально, даже еслиB
ctor естьprotected
.То , что я не заметил, что
std::basic_istream
,std::basic_ostream
аstd::basic_iostream
также были общественные конструкторы (каждый беретstd::basic_streambuf*
).Это позволяет использовать универсальный программный аналог полиморфизма в том же духе, что и pimpl.
Таким образом, вы можете создать специализированный тип streambuf и использовать его в
basic_
[io],stream
не создавая специализированных потоковых классов. (Функциональность ограничена: вы не можете назначить новый буфер тому же потоку, и вы должны внешне отслеживать время жизни буфера и его владельца).Каждый из специализированных
basic_
[io]fstream
иbasic_
[io]stringstream
содержит полный экземпляр соответствующего типа буфера. Это означает, что экземпляр специализированного типа потока будет работать только со своим внутренним буфером, а не с другим, даже не с одним и тем же типом. Использование необработанногоbasic_
[io]stream
- это (неуклюжий) обходной путь для этого.источник