#include <string>
#include <iostream>
class BaseIf
{
public:
virtual ~BaseIf() {}
virtual std::string getName() = 0;
};
class IntIf : public virtual BaseIf
{
public:
virtual ~IntIf() {}
virtual int getValue() = 0;
};
class FloatIf : public virtual BaseIf
{
public:
virtual ~FloatIf() {}
virtual float getValue() = 0;
};
class BaseBlock : public virtual BaseIf
{
public:
std::string getName () override { return "whoa dude"; }
};
class IntBlock : public virtual IntIf
{
public:
int getValue() override { return 42; }
};
class BaseImpl : public BaseBlock {};
class IntImpl : public BaseBlock, public IntBlock {};
int main()
{
BaseIf* bif = new IntImpl;
std::cout << bif->getName() << "\n";
IntImpl iimp;
std::cout << iimp.getName() << "\n";
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQmFzZUlmCnsKcHVibGljOgogICAgdmlydHVhbCB+QmFzZUlmKCkge30KCiAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSA9IDA7Cn07CgpjbGFzcyBJbnRJZiA6IHB1YmxpYyB2aXJ0dWFsIEJhc2VJZgp7CnB1YmxpYzoKICAgIHZpcnR1YWwgfkludElmKCkge30KCiAgICB2aXJ0dWFsIGludCBnZXRWYWx1ZSgpID0gMDsKfTsKCmNsYXNzIEZsb2F0SWYgOiBwdWJsaWMgdmlydHVhbCBCYXNlSWYKewpwdWJsaWM6CiAgICB2aXJ0dWFsIH5GbG9hdElmKCkge30KCiAgICB2aXJ0dWFsIGZsb2F0IGdldFZhbHVlKCkgPSAwOwp9OwoKY2xhc3MgQmFzZUJsb2NrIDogcHVibGljIHZpcnR1YWwgQmFzZUlmCnsKICBwdWJsaWM6CglzdGQ6OnN0cmluZyBnZXROYW1lICgpIG92ZXJyaWRlIHsgcmV0dXJuICJ3aG9hIGR1ZGUiOyB9Cn07CgpjbGFzcyBJbnRCbG9jayA6IHB1YmxpYyB2aXJ0dWFsIEludElmCnsKICBwdWJsaWM6CiAgICBpbnQgZ2V0VmFsdWUoKSBvdmVycmlkZSB7IHJldHVybiA0MjsgfQp9OwoKY2xhc3MgQmFzZUltcGwgOiBwdWJsaWMgQmFzZUJsb2NrIHt9OwoKY2xhc3MgSW50SW1wbCA6IHB1YmxpYyBCYXNlQmxvY2ssIHB1YmxpYyBJbnRCbG9jayB7fTsKCmludCBtYWluKCkKewogICBCYXNlSWYqIGJpZiA9IG5ldyBJbnRJbXBsOwogICBzdGQ6OmNvdXQgPDwgYmlmLT5nZXROYW1lKCkgPDwgIlxuIjsKICAgCiAgIEludEltcGwgaWltcDsKICAgc3RkOjpjb3V0IDw8IGlpbXAuZ2V0TmFtZSgpIDw8ICJcbiI7CiAgIAp9