#include <iostream>

struct Manoscritto
{
    virtual ~Manoscritto() {}

    // ...

    virtual std::ostream& memorizza_dati( std::ostream& stm ) const // 1
    {
        std::cout << "memorizza_dati for Manoscritto" ;
        // TODO: replace the above with writing out the actual stuff

        return stm ;
    }

    // ...
};

std::ostream& operator << ( std::ostream& stm, const Manoscritto& m ) // 2
{ return m.memorizza_dati(stm) ; }

struct Lettera : public Manoscritto
{
    // ...

    virtual std::ostream& memorizza_dati( std::ostream& stm ) const override // 3
    {
        // call base class function if required
        // Manoscritto::print(stm) ;

        std::cout << "memorizza_dati for Lettera" ;
        // TODO: replace the above with writing out added stuff

        return stm ;
    }

    // ...
};

int main()
{
    Manoscritto m1, m2 ;
    Lettera l1, l2, l3 ;

    Manoscritto* Elenco[] = { &m1, &l1, &l2, &m2, &l3 } ;

    for( Manoscritto* p : Elenco ) std::cout << *p << '\n' ;

    std::cout << '\n' ;

    // or:
    for( Manoscritto* p : Elenco ) p->memorizza_dati(std::cout) << '\n' ;
}
