#include <iostream>
class IPlayer
{
public:
virtual bool IsValid() = 0;
virtual bool Equals(const IPlayer *other) = 0;
};
class ILocalPlayer : virtual public IPlayer
{
public:
virtual bool CanShoot() = 0;
};
class SourcePlayer : virtual public IPlayer
{
public:
SourcePlayer(int index)
: index(index)
{
}
virtual bool IsValid()
{
return true;
}
virtual bool Equals(const IPlayer *other)
{
//const SourcePlayer *p = dynamic_cast<const SourcePlayer*>(other);
//return index == p->index;
return Equals(dynamic_cast<const SourcePlayer*>(other));
}
bool Equals(const SourcePlayer *other)
{
return index == other->index;
}
private:
int index;
};
class SourceLocalPlayer : public SourcePlayer, public ILocalPlayer
{
public:
SourceLocalPlayer(int index)
: SourcePlayer(index)
{
}
virtual bool CanShoot()
{
return false;
}
};
int main()
{
ILocalPlayer *local = new SourceLocalPlayer(1);
IPlayer *player = new SourcePlayer(1);
std::cout << (local->Equals(player) ? "gleich" : "ungleich");
delete player;
delete local;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgSVBsYXllcgp7CnB1YmxpYzoKCXZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgPSAwOwoJdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBJUGxheWVyICpvdGhlcikgPSAwOwp9OwoKY2xhc3MgSUxvY2FsUGxheWVyIDogdmlydHVhbCBwdWJsaWMgSVBsYXllcgp7CnB1YmxpYzoKCXZpcnR1YWwgYm9vbCBDYW5TaG9vdCgpID0gMDsKfTsKCmNsYXNzIFNvdXJjZVBsYXllciA6IHZpcnR1YWwgcHVibGljIElQbGF5ZXIKewpwdWJsaWM6CglTb3VyY2VQbGF5ZXIoaW50IGluZGV4KQoJCTogaW5kZXgoaW5kZXgpCgl7CgoJfQoKCXZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkKCXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBJUGxheWVyICpvdGhlcikKCXsKCQkvL2NvbnN0IFNvdXJjZVBsYXllciAqcCA9IGR5bmFtaWNfY2FzdDxjb25zdCBTb3VyY2VQbGF5ZXIqPihvdGhlcik7CgkJLy9yZXR1cm4gaW5kZXggPT0gcC0+aW5kZXg7CgkJcmV0dXJuIEVxdWFscyhkeW5hbWljX2Nhc3Q8Y29uc3QgU291cmNlUGxheWVyKj4ob3RoZXIpKTsKCX0KCQoJYm9vbCBFcXVhbHMoY29uc3QgU291cmNlUGxheWVyICpvdGhlcikKCXsKCQlyZXR1cm4gaW5kZXggPT0gb3RoZXItPmluZGV4OwoJfQoKcHJpdmF0ZToKCWludCBpbmRleDsKfTsKCmNsYXNzIFNvdXJjZUxvY2FsUGxheWVyIDogcHVibGljIFNvdXJjZVBsYXllciwgcHVibGljIElMb2NhbFBsYXllcgp7CnB1YmxpYzoKCVNvdXJjZUxvY2FsUGxheWVyKGludCBpbmRleCkKCQk6IFNvdXJjZVBsYXllcihpbmRleCkKCXsKCgl9CgoJdmlydHVhbCBib29sIENhblNob290KCkKCXsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn07CgppbnQgbWFpbigpCnsKCUlMb2NhbFBsYXllciAqbG9jYWwgPSBuZXcgU291cmNlTG9jYWxQbGF5ZXIoMSk7CglJUGxheWVyICpwbGF5ZXIgPSBuZXcgU291cmNlUGxheWVyKDEpOwoJCglzdGQ6OmNvdXQgPDwgKGxvY2FsLT5FcXVhbHMocGxheWVyKSA/ICJnbGVpY2giIDogInVuZ2xlaWNoIik7CgkKCWRlbGV0ZSBwbGF5ZXI7CglkZWxldGUgbG9jYWw7Cn0=