#include <iostream>
#include <typeinfo>

struct A
{
    virtual ~A() {}
    virtual int get_it() const { return i ; }
    int i = 3 ;
};

struct B : A
{
    virtual int get_it() const override { return A::get_it() + j ; }
    int j = 5 ;
};

int foo( const A& a ) { return a.get_it() ; }

int bar( const A& a )
{
    int result = a.i ;

    try
    {
        const B& b = dynamic_cast< const B& >(a) ;
        result += b.j ;
    }
    catch( const std::bad_cast& ) { /* this is not a B */ }

    return result ;
}

int main()
{
    A a ;
    std::cout << foo(a) << ' ' << bar(a) << '\n' ;

    B b ;
    std::cout << foo(b) << ' ' << bar(b) << '\n' ;

}
