#include <iostream>

typedef void(*ISSFUNC)(void*);

struct AInst
{
    void* data;
    ISSFUNC func;
};

AInst* mInst;

void saveAInst(void* inst, ISSFUNC func)
{
    mInst = new AInst();
    mInst->data = inst;
    mInst->func = func;
}

void issueInst()
{
    mInst->func(mInst->data);
    delete mInst;
}

class AHandler
{
public:
    virtual void print() = 0;
};

class A
{
private:
    AHandler* mHandler;

    static void funct(void* data)
    {
        A* a = reinterpret_cast<A*>(data);
        a->mHandler->print();
    }
public:
    A(AHandler* handler = nullptr) : mHandler(handler)
    {
        saveAInst(this, &funct);
    }
};

class AHandlerImpl1 : public AHandler
{
public:
    virtual void print() override
    {
        std::cout << "Implementation 1\n";
    }
};

class AHandlerImpl2 : public AHandler
{
public:
    virtual void print() override
    {
        std::cout << "Implementation 2\n";
    }
};

int main()
{
    AHandlerImpl1 impl1;
    AHandlerImpl2 impl2;

    A a1(&impl1);

    issueInst();

    A a2(&impl2);

    issueInst();

    return 0;
}
