#include <iostream>
using namespace std;

class led {
private: 
	int id; 
	static int nextid; 
public:  
    led() { id=++nextid; }
    int get_id() { return id; }
	void turn_on() { cout<<"Turn on led "<<id<<endl; }
	void turn_off() { cout<<"Turn off led "<<id<<endl; }
};
class blinking_led : public led {
public:
	void blink() { cout<<"Blink "<<get_id()<<endl; cout<<"  ->"; turn_on();cout<<"  ->"; turn_off();}
};
class auto_switch{
	void (led::*action)(); 
	led *ld; 
public: 
	auto_switch(void(led::*a)(), led*l) : action(a), ld(l) {}
	void go	() { (ld->*action)(); }
}; 

int led::nextid=0; 

int main() {
	led l1; 
	blinking_led l2; 
	l1.turn_on(); l1.turn_off(); 
	l2.blink(); 
	auto_switch s(&led::turn_off, &l1);
	s.go(); 
	auto_switch s2(&blinking_led::blink, &l2);
	
	return 0;
}