00 
01 class Counter
02 {
03 protected:
04     int  counter;
05 
06 public:
07     Counter(int cnt): counter{cnt} {}
08     virtual void operator() (int i) = 0; 
09     // ...
10 };
11 
12 class AdvancedCounter: public Counter
13 {
14 public:
15     AdvancedCounter(int cnt): Counter{cnt} {}
16 
17     void operator() (int increment) override
18     { counter += increment; }  
19 };
20 
21 void IncreaseCounter(Counter* c)
22 {
23 
24     if (auto ac = dynamic_cast<AdvancedCounter*>(c))
25     {
26 	(*ac)(10);	
27     }
28     // else 
29     // ... 
30 }
31 
32 int main ()
33 {
34   AdvancedCounter a{1};
35 
36   IncreaseCounter(&a);
37   
38   return  0;
39 }
40