Поддерживают ли стандартные потоки C++ полиморфное использование?
Скажите, пожалуйста, поддерживают ли стандартные потоки C++ полиморфное использование?
Например:
void Function(std::ifstream& ifstream)
{
// ...
}
std::fstream fstream;
Function(fstream);
Я пытался найти внятный ответ, но не смог. Попробовал выяснить сам, полистав исходный код stl, но там ничего не понятно.
Ответы (1 шт):
Известно, что ссылка на базовый класс может ссылаться на объект производного класса (в данном случае имеется ввиду public наследование) без явного преобразования.
Теперь давайте взглянем на иерархию классов ввода-вывода:

Видим, что basic_fstream наследуется от basic_iostream, который наследуется от двух классов: basic_istream и basic_ostream. А класс basic_ifstream наследуется от basic_istream. Т.е. basic_fstream и basic_ifstream имеют ближайшего общего предка basic_istream. Тогда Ваша функция должна иметь вид
void Function(std::istream& stream) // для char, или wistream для wchar_t
{
// ...
}
чтобы принимать объекты классов ifstream и fstream. Но, имеет ли это смысл? Это уже другой вопрос.