С++ странный вывод(полиморфизм, массивы)
#include <iostream>
using namespace std;
class Base
{
public:
int numerator;
Base(): numerator(666)
{
}
friend ostream& operator<<(ostream& os, const Base& dtostream)
{
os << "Base: " << dtostream.numerator << endl;
return os;
}
};
class Derived : public Base
{
public:
Derived():a(111), ch('x')
{
}
friend ostream& operator<<(ostream& os, const Derived& x)
{
cout << "Derived: ";
cout << x.a << " " << x.ch << endl;
}
char ch;
int a;
};
int main()
{
Base* arr = new Derived[5];
for (size_t i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
}
Выводиться какая-то ******:
Base: 666
Base: -842150536
Base: 111
Base: 666
Base: -842150536
Но почему? Что за значения? Почему вызвался оператор << не дочернего класса?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Потому что то, что вы хотите - динамический полиморфизм - требует виртуальных функций. Чего у вас никак нет.
Хотите динамического полиморфизма - обеспечьте его, например:
class Base
{
public:
int numerator;
Base(): numerator(666)
{
}
virtual ostream& out(ostream& os) const
{
return os << "Base: " << numerator << endl;
}
};
class Derived : public Base
{
public:
Derived():a(111), ch('x')
{
}
char ch;
int a;
virtual ostream& out(ostream& os) const
{
return os << "Derived: " << a << " " << ch << endl;
}
};
ostream& operator<<(ostream& os, const Base& b)
{
return b.out(os);
}
int main()
{
Derived * arr = new Derived[5];
for (size_t i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
}
Замечу также, что, поскольку sizeof(Base) и sizeof(Derived) не равны, ваша попытка
Base* arr = new Derived[5];
конечно, смелая, но... но arr[1] и далее - совсем не указатели на элементы Derived, а на какие-то промежуточные места в памяти. Вот и получается [censored]. Подумайте об этом.