struct ITarget {};
struct ISource {
virtual ~ISource() {}
};
struct IBase {};
struct IInput : virtual public IBase, virtual public ITarget {};
struct IOutput : virtual public IBase, virtual public ISource {};
struct SBase : virtual public IBase, virtual public ISource, virtual public ITarget {};
struct SInput : public IInput, public SBase {};
struct SOutput : public IOutput, public SBase {};
#include <iostream>
int main()
{
ISource* s = new SInput;
SInput* i = dynamic_cast<SInput*>(s);
if (i) std::cout << "YES\n";
}
c3RydWN0IElUYXJnZXQge307CgpzdHJ1Y3QgSVNvdXJjZSB7CiAgdmlydHVhbCB+SVNvdXJjZSgpIHt9Cn07CgpzdHJ1Y3QgSUJhc2Uge307CgpzdHJ1Y3QgSUlucHV0IDogdmlydHVhbCBwdWJsaWMgSUJhc2UsIHZpcnR1YWwgcHVibGljIElUYXJnZXQge307CgpzdHJ1Y3QgSU91dHB1dCA6IHZpcnR1YWwgcHVibGljIElCYXNlLCB2aXJ0dWFsIHB1YmxpYyBJU291cmNlIHt9OwoKc3RydWN0IFNCYXNlIDogdmlydHVhbCBwdWJsaWMgSUJhc2UsIHZpcnR1YWwgcHVibGljIElTb3VyY2UsIHZpcnR1YWwgcHVibGljIElUYXJnZXQge307CgpzdHJ1Y3QgU0lucHV0IDogcHVibGljIElJbnB1dCwgcHVibGljIFNCYXNlIHt9OwoKc3RydWN0IFNPdXRwdXQgOiBwdWJsaWMgSU91dHB1dCwgcHVibGljIFNCYXNlIHt9OwoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKQp7CiAgSVNvdXJjZSogcyA9IG5ldyBTSW5wdXQ7CiAgU0lucHV0KiBpID0gZHluYW1pY19jYXN0PFNJbnB1dCo+KHMpOwogIGlmIChpKSBzdGQ6OmNvdXQgPDwgIllFU1xuIjsKfQo=