#include <iostream>
struct base
{
std::ostream& print(std::ostream&out_) const
{
out_<<"I'am a class : ";
return do_print(out_);
}
virtual ~base() // =default con C++0x
{}
private :
virtual std::ostream& do_print(std::ostream&out_) const
{
return out_<<"base";
}
};
struct derived : public base
{
private:
virtual std::ostream& do_print(std::ostream&out_) const
{
return out_<<"derived";
}
};
std::ostream& operator<<(std::ostream&out_, base const &base_)
{
base_.print(out_);
return out_<<"n";
}
void tell_me_who_am_i(base const&b_)
{
std::cout<<b_;
}
int main()
{
tell_me_who_am_i(base());
tell_me_who_am_i(derived());
return 0;
}