#include <iostream>
using namespace std;

enum AType
{
    a1 = 1, a2
};

class B
{
public:
    virtual ~B() = default;
public:
    virtual int f() const = 0;
};

class A1: public B
{
    virtual int f() const override
    {
        return 1;
    }
};
class A2: public B
{
    virtual int f() const override
    {
        return 2;
    }
};

void executeF(void* aPtr, AType aType, int* result)
{
    B* bPtr = nullptr;
    switch(aType)
    {
        case a1:
            bPtr = static_cast<A1*>(aPtr);
            break;
        case a2:
            bPtr = static_cast<A1*>(aPtr);
            break;
        default:
            break;
    }

    if(bPtr)
        *result = bPtr->f();
}

int main() {
	A1* a1Ptr = new A1();
	A2* a2Ptr = new A2();
	
	void* a1VoidPtr = a1Ptr;
	void* a2VoidPtr = a2Ptr;
	
	int res(0);
	executeF(a1VoidPtr, AType::a1, &res);
	cout << res << endl;
	executeF(a2VoidPtr, AType::a2, &res);
	cout << res << endl;
	
	return 0;
}