#include "boost/pointer_cast.hpp"usingboost::shared_ptr;usingboost::dynamic_pointer_cast;classIMessageHandler;classMessage{public:virtual~Message(){}};classIMessageHandler{public:virtualboolhandleMessage(shared_ptr<Message>msg)=0;};classBadNews:publicMessage{};classYouWereAdopted:publicBadNews{};classGoodNews:publicMessage{};classYouWonTheLottery:publicGoodNews{};classTabloidNews:publicMessage{public:};classInaneDrivel:publicTabloidNews{};classNewsMessageHandler:publicIMessageHandler{public:virtualboolhandleMessage(shared_ptr<Message>msg){shared_ptr<BadNews>bad;shared_ptr<GoodNews>good;shared_ptr<TabloidNews>tabloid;if(bad=dynamic_pointer_cast<BadNews>(msg)){cout<<"Sorry, you got some bad news"<<endl;returntrue;}elseif(tabloid=dynamic_pointer_cast<TabloidNews>(msg)){cout<<"Sorry, you got some tabloid news"<<endl;returntrue;}elseif(good=dynamic_pointer_cast<GoodNews>(msg)){cout<<"You got some good news"<<endl;returntrue;}returnfalse;}};intmain(){shared_ptr<NewsMessageHandler>h(newNewsMessageHandler());shared_ptr<Message>b(newBadNews());shared_ptr<Message>g(newGoodNews());shared_ptr<Message>t(newTabloidNews());shared_ptr<Message>lottery(newYouWonTheLottery());shared_ptr<Message>adopted(newYouWereAdopted());shared_ptr<Message>drivel(newInaneDrivel());h->handleMessage(b);h->handleMessage(g);h->handleMessage(t);h->handleMessage(adopted);h->handleMessage(lottery);h->handleMessage(drivel);}
Sorry, you got some bad news
You got some good news
Sorry, you got some tabloid news
Sorry, you got some bad news
You got some good news
Sorry, you got some tabloid news