С++ странный вывод(полиморфизм, массивы)

#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]. Подумайте об этом.

→ Ссылка