Есть такой шаблон проектирования "визитер":
/////////////////////////////////////////////////////
// модель
//
class Integer;
class String;
class Visitor
{
public:
virtual void Process(Integer &) = 0;
virtual void Process(String &) = 0;
}; // class Visitor..
class Base
{
public:
virtual ~Base() {}
virtual void Visit(Visitor &) = 0;
}; // class Base..
class Integer : public Base
{
int value_;
public: // конструкторы
Integer(int value) :
value_(value)
{
}
public: // селекторы
int Get() const
{
return value_;
}
public: // переопределение поведения
virtual void Visit(Visitor &v)
{
v.Process(*this);
}
}; // class Integer : public Base..
class String : public Base
{
std::string value_;
public: // конструкторы
String(const std::string& value) :
value_(value)
{
}
public: // селекторы
cosnt std::string& Get() const
{
return value_;
}
public: // переопределение поведения
virtual void Visit(Visitor &v)
{
v.Process(*this);
}
}; // class String..
/////////////////////////////////////////////////
// приложение
//
class Total : public Visitor
{
int total_;
public: // конструкторы
Total() : total_(0) {}
public: // селекторы
int Get() const {return total_;}
public: // переопределение поведения
void Process(Integer &v)
{
total_ += v.Get();
}
void Process(String &) {}
};
void main()
{
list<Base*> lst;
lst.push_back(new Integer(1));
lst.push_back(new String("something"));
Total total;
for(list<A*>::iterator it = lst.begin(); it != lst.end(); it++)
(*it).Process(total);
std::cout << "Total :" << total.Get();
}