#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSBBVHlwZQp7CiAgICBhMSA9IDEsIGEyCn07CgpjbGFzcyBCCnsKcHVibGljOgogICAgdmlydHVhbCB+QigpID0gZGVmYXVsdDsKcHVibGljOgogICAgdmlydHVhbCBpbnQgZigpIGNvbnN0ID0gMDsKfTsKCmNsYXNzIEExOiBwdWJsaWMgQgp7CiAgICB2aXJ0dWFsIGludCBmKCkgY29uc3Qgb3ZlcnJpZGUKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfTsKY2xhc3MgQTI6IHB1YmxpYyBCCnsKICAgIHZpcnR1YWwgaW50IGYoKSBjb25zdCBvdmVycmlkZQogICAgewogICAgICAgIHJldHVybiAyOwogICAgfQp9OwoKdm9pZCBleGVjdXRlRih2b2lkKiBhUHRyLCBBVHlwZSBhVHlwZSwgaW50KiByZXN1bHQpCnsKICAgIEIqIGJQdHIgPSBudWxscHRyOwogICAgc3dpdGNoKGFUeXBlKQogICAgewogICAgICAgIGNhc2UgYTE6CiAgICAgICAgICAgIGJQdHIgPSBzdGF0aWNfY2FzdDxBMSo+KGFQdHIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGEyOgogICAgICAgICAgICBiUHRyID0gc3RhdGljX2Nhc3Q8QTEqPihhUHRyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYoYlB0cikKICAgICAgICAqcmVzdWx0ID0gYlB0ci0+ZigpOwp9CgppbnQgbWFpbigpIHsKCUExKiBhMVB0ciA9IG5ldyBBMSgpOwoJQTIqIGEyUHRyID0gbmV3IEEyKCk7CgkKCXZvaWQqIGExVm9pZFB0ciA9IGExUHRyOwoJdm9pZCogYTJWb2lkUHRyID0gYTJQdHI7CgkKCWludCByZXMoMCk7CglleGVjdXRlRihhMVZvaWRQdHIsIEFUeXBlOjphMSwgJnJlcyk7Cgljb3V0IDw8IHJlcyA8PCBlbmRsOwoJZXhlY3V0ZUYoYTJWb2lkUHRyLCBBVHlwZTo6YTIsICZyZXMpOwoJY291dCA8PCByZXMgPDwgZW5kbDsKCQoJcmV0dXJuIDA7Cn0=