Поддерживают ли стандартные потоки C++ полиморфное использование?

Скажите, пожалуйста, поддерживают ли стандартные потоки C++ полиморфное использование?

Например:

void Function(std::ifstream& ifstream)
{
    // ...
}

std::fstream fstream;
Function(fstream);

Я пытался найти внятный ответ, но не смог. Попробовал выяснить сам, полистав исходный код stl, но там ничего не понятно.


Ответы (1 шт):

Автор решения: EOF

Известно, что ссылка на базовый класс может ссылаться на объект производного класса (в данном случае имеется ввиду 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. Но, имеет ли это смысл? Это уже другой вопрос.

→ Ссылка