#include <iostream>
class A
{
protected:
virtual void do_thing_impl() = 0;
public:
virtual ~A(){}
static void do_thing(A * _ptr){ _ptr->do_thing_impl(); }
};
class B : public A
{
protected:
void do_thing_impl(){ std::cout << "B impl" << std::endl; }
};
class C : public A
{
protected:
void do_thing_impl(){ std::cout << "C impl" << std::endl; }
};
int main()
{
B b_;
C c_;
A::do_thing(&b_);
A::do_thing(&c_);
return (0);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQQp7CiBwcm90ZWN0ZWQ6CiAgdmlydHVhbCB2b2lkIGRvX3RoaW5nX2ltcGwoKSA9IDA7CiBwdWJsaWM6CiAgdmlydHVhbCB+QSgpe30KICBzdGF0aWMgdm9pZCBkb190aGluZyhBICogX3B0cil7IF9wdHItPmRvX3RoaW5nX2ltcGwoKTsgfQp9OwoKY2xhc3MgQiA6IHB1YmxpYyBBCnsKIHByb3RlY3RlZDoKICB2b2lkIGRvX3RoaW5nX2ltcGwoKXsgc3RkOjpjb3V0IDw8ICJCIGltcGwiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKY2xhc3MgQyA6IHB1YmxpYyBBCnsKIHByb3RlY3RlZDoKICB2b2lkIGRvX3RoaW5nX2ltcGwoKXsgc3RkOjpjb3V0IDw8ICJDIGltcGwiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKaW50IG1haW4oKSAKewogQiBiXzsKIEMgY187CgogQTo6ZG9fdGhpbmcoJmJfKTsKIEE6OmRvX3RoaW5nKCZjXyk7CQogCiByZXR1cm4gKDApOwp9Cg==