#include<iostream>
using namespace std;
#include<string>

class Expr
{
    public:
       virtual void print()const =0;
       friend ostream& operator<<(ostream &s, const Expr &num)
       {
           num.print();
           return s;
       }  
};
class NumExpr : public Expr {
        public:
            NumExpr( string v );
            string name();
            virtual void print() const
            {
                cout<<*this;
            }
            
        private:
            int number;
            friend ostream& operator<<(ostream &s, const NumExpr &num);
    };

 NumExpr::NumExpr( string n ) {
        number = 10;
    }
    string NumExpr::name() {
        return "num";
    }
    ostream & operator<<(ostream &s, const NumExpr &num) {
        s << num.number;
        return s;
    }
int main()
{
    NumExpr* numexpr = new NumExpr("hello"); 
    Expr* expr = numexpr; 
    cout << *expr;
     

     return 0;
}