#include <iostream>
using namespace std;
class Base;
class A;
class B;
class Base {
public:
const char* type;
int value;
virtual bool operator==(Base&) = 0;
virtual bool equals(A*) = 0;
virtual bool equals(B*) = 0;
protected:
Base(){}
};
class A : public Base {
public:
const char* type;
int value;
A(int value = 0) : type("A"), value(value) {}
virtual bool operator==(Base& base) {
return base.equals(this);
}
protected:
virtual bool equals(A* a){
return (type == a->type && value == a->value);
}
virtual bool equals(B* b){
return false;
}
};
class B : public Base {
public:
const char* type;
int value;
B(int value = 0) : type("B"), value(value) {}
virtual bool operator==(Base& base) {
return base.equals(this);
}
protected:
virtual bool equals(A* a){
return false;
}
virtual bool equals(B* b){
return (type == b->type && value == b->value);
}
};
int main() {
A a(5);
A a2(5);
B b(5);
Base *base_a = &a;
Base *base_a2 = &a2;
Base *base_b = &b;
cout << (*base_a == *base_b) << endl;
cout << (*base_a == *base_a2) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFzZTsKY2xhc3MgQTsKY2xhc3MgQjsKCmNsYXNzIEJhc2UgewpwdWJsaWM6Cgljb25zdCBjaGFyKiB0eXBlOwoJaW50IHZhbHVlOwoJdmlydHVhbCBib29sIG9wZXJhdG9yPT0oQmFzZSYpID0gMDsKCXZpcnR1YWwgYm9vbCBlcXVhbHMoQSopID0gMDsKCXZpcnR1YWwgYm9vbCBlcXVhbHMoQiopID0gMDsKcHJvdGVjdGVkOgoJQmFzZSgpe30KfTsKCmNsYXNzIEEgOiBwdWJsaWMgQmFzZSB7CnB1YmxpYzoKCWNvbnN0IGNoYXIqIHR5cGU7CglpbnQgdmFsdWU7CglBKGludCB2YWx1ZSA9IDApIDogdHlwZSgiQSIpLCB2YWx1ZSh2YWx1ZSkge30KCQoJdmlydHVhbCBib29sIG9wZXJhdG9yPT0oQmFzZSYgYmFzZSkgewoJCXJldHVybiBiYXNlLmVxdWFscyh0aGlzKTsKCX0KcHJvdGVjdGVkOgoJdmlydHVhbCBib29sIGVxdWFscyhBKiBhKXsKCQlyZXR1cm4gKHR5cGUgPT0gYS0+dHlwZSAmJiB2YWx1ZSA9PSBhLT52YWx1ZSk7Cgl9Cgl2aXJ0dWFsIGJvb2wgZXF1YWxzKEIqIGIpewoJCXJldHVybiBmYWxzZTsKCX0KfTsKY2xhc3MgQiA6IHB1YmxpYyBCYXNlIHsKcHVibGljOgoJY29uc3QgY2hhciogdHlwZTsKCWludCB2YWx1ZTsKCUIoaW50IHZhbHVlID0gMCkgOiB0eXBlKCJCIiksIHZhbHVlKHZhbHVlKSB7fQoJCgl2aXJ0dWFsIGJvb2wgb3BlcmF0b3I9PShCYXNlJiBiYXNlKSB7CgkJcmV0dXJuIGJhc2UuZXF1YWxzKHRoaXMpOwoJfQpwcm90ZWN0ZWQ6Cgl2aXJ0dWFsIGJvb2wgZXF1YWxzKEEqIGEpewoJCXJldHVybiBmYWxzZTsKCX0KCXZpcnR1YWwgYm9vbCBlcXVhbHMoQiogYil7CgkJcmV0dXJuICh0eXBlID09IGItPnR5cGUgJiYgdmFsdWUgPT0gYi0+dmFsdWUpOwoJfQp9OwoKaW50IG1haW4oKSB7CglBIGEoNSk7CglBIGEyKDUpOwoJQiBiKDUpOwoJQmFzZSAqYmFzZV9hID0gJmE7CglCYXNlICpiYXNlX2EyID0gJmEyOwoJQmFzZSAqYmFzZV9iID0gJmI7CgkKCWNvdXQgPDwgKCpiYXNlX2EgPT0gKmJhc2VfYikgPDwgZW5kbDsKCWNvdXQgPDwgKCpiYXNlX2EgPT0gKmJhc2VfYTIpIDw8IGVuZGw7CgkKCXJldHVybiAwOwp9