#include <iostream>
using namespace std;
class IObject
{
public:
virtual int getType()=0;
};
class Base : public IObject
{
protected:
int val;
public:
Base() { val = 1; }
virtual int getType();
};
int Base::getType() { return val; }
class Derived : public virtual Base //If I remove the virtual keyword here problem is solved.
{
public:
Derived() { val = 2; }
};
int getVal( void* ptr )
{
return ((IObject*)ptr)->getType();
}
int main()
{
IObject* ptr = new Derived();
cout << getVal(ptr) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSU9iamVjdAp7CnB1YmxpYzoKICAgIHZpcnR1YWwgaW50IGdldFR5cGUoKT0wOwp9OwpjbGFzcyBCYXNlIDogcHVibGljIElPYmplY3QKewpwcm90ZWN0ZWQ6CiAgICBpbnQgdmFsOwpwdWJsaWM6CiAgICBCYXNlKCkgeyB2YWwgPSAxOyB9CiAgICB2aXJ0dWFsIGludCBnZXRUeXBlKCk7Cn07CmludCBCYXNlOjpnZXRUeXBlKCkgeyByZXR1cm4gdmFsOyB9CgpjbGFzcyBEZXJpdmVkIDogcHVibGljIHZpcnR1YWwgQmFzZSAvL0lmIEkgcmVtb3ZlIHRoZSB2aXJ0dWFsIGtleXdvcmQgaGVyZSBwcm9ibGVtIGlzIHNvbHZlZC4KewpwdWJsaWM6CiAgICBEZXJpdmVkKCkgeyB2YWwgPSAyOyB9Cn07CgppbnQgZ2V0VmFsKCB2b2lkKiBwdHIgKSAKewogICAgcmV0dXJuICgoSU9iamVjdCopcHRyKS0+Z2V0VHlwZSgpOwp9CgppbnQgbWFpbigpCnsKICAgIElPYmplY3QqIHB0ciA9IG5ldyBEZXJpdmVkKCk7CiAgICBjb3V0IDw8IGdldFZhbChwdHIpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==