#include <iostream>
class Circle; class Rectangle;
struct Shape {
virtual void overlap(Shape* y) =0; //{ std::cout << "Circle, Shape" << std::endl; }
virtual void overlap(Circle* x){};
virtual void overlap(Rectangle* x){};
};
struct Circle: Shape {
void overlap(Shape* y) { y->overlap(this); }
void overlap(Circle* y) { std::cout << "Circle, Circle" << std::endl; }
void overlap(Rectangle* y) { std::cout << "Circle, Rectangle" << std::endl; }
};
struct Rectangle: Shape {
void overlap(Shape* y) { y->overlap(this); }
void overlap(Circle* y) { std::cout << "Rectangle, Circle" << std::endl; }
void overlap(Rectangle* y) { std::cout << "Rectangle, Rectangle" << std::endl; }
};
//void Shape::overlap(Circle*x) { x->overlap(this); }
void overlap(Shape* x, Shape* y) { std::cout << "Shape, Shape" << std::endl; }
void overlap(Circle* x, Shape* y) { std::cout << "Circle, Shape" << std::endl; }
void overlap(Circle* x, Circle* y) { std::cout << "Circle, Circle" << std::endl; }
int main() {
Shape* x = new Circle();
Shape* y = new Circle();
Shape* z = new Rectangle();
std::cout<<"1-----"<<std::endl;
x->overlap(y);
overlap(x, y);
std::cout<<"2-----"<<std::endl;
x->overlap(z);
overlap(x, z);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQ2lyY2xlOyBjbGFzcyBSZWN0YW5nbGU7IApzdHJ1Y3QgU2hhcGUgewogIHZpcnR1YWwgdm9pZCBvdmVybGFwKFNoYXBlKiB5KSA9MDsgLy97IHN0ZDo6Y291dCA8PCAiQ2lyY2xlLCBTaGFwZSIgPDwgc3RkOjplbmRsOyAgfQogIHZpcnR1YWwgdm9pZCBvdmVybGFwKENpcmNsZSogeCl7fTsKICB2aXJ0dWFsIHZvaWQgb3ZlcmxhcChSZWN0YW5nbGUqIHgpe307Cn07CgpzdHJ1Y3QgQ2lyY2xlOiBTaGFwZSB7CiAgdm9pZCBvdmVybGFwKFNoYXBlKiB5KSB7IHktPm92ZXJsYXAodGhpcyk7IH0KICB2b2lkIG92ZXJsYXAoQ2lyY2xlKiB5KSB7IHN0ZDo6Y291dCA8PCAiQ2lyY2xlLCBDaXJjbGUiIDw8IHN0ZDo6ZW5kbDsgfQogIHZvaWQgb3ZlcmxhcChSZWN0YW5nbGUqIHkpIHsgc3RkOjpjb3V0IDw8ICJDaXJjbGUsIFJlY3RhbmdsZSIgPDwgc3RkOjplbmRsOyB9Cn07CnN0cnVjdCBSZWN0YW5nbGU6IFNoYXBlIHsKICB2b2lkIG92ZXJsYXAoU2hhcGUqIHkpIHsgeS0+b3ZlcmxhcCh0aGlzKTsgfQogIHZvaWQgb3ZlcmxhcChDaXJjbGUqIHkpIHsgc3RkOjpjb3V0IDw8ICJSZWN0YW5nbGUsIENpcmNsZSIgPDwgc3RkOjplbmRsOyB9CiAgdm9pZCBvdmVybGFwKFJlY3RhbmdsZSogeSkgeyBzdGQ6OmNvdXQgPDwgIlJlY3RhbmdsZSwgUmVjdGFuZ2xlIiA8PCBzdGQ6OmVuZGw7IH0KfTsKCi8vdm9pZCBTaGFwZTo6b3ZlcmxhcChDaXJjbGUqeCkgeyB4LT5vdmVybGFwKHRoaXMpOyB9CnZvaWQgb3ZlcmxhcChTaGFwZSogeCwgU2hhcGUqIHkpIHsgc3RkOjpjb3V0IDw8ICJTaGFwZSwgU2hhcGUiIDw8IHN0ZDo6ZW5kbDsgfQp2b2lkIG92ZXJsYXAoQ2lyY2xlKiB4LCBTaGFwZSogeSkgeyBzdGQ6OmNvdXQgPDwgIkNpcmNsZSwgU2hhcGUiIDw8IHN0ZDo6ZW5kbDsgfQp2b2lkIG92ZXJsYXAoQ2lyY2xlKiB4LCBDaXJjbGUqIHkpIHsgc3RkOjpjb3V0IDw8ICJDaXJjbGUsIENpcmNsZSIgPDwgc3RkOjplbmRsOyB9CgppbnQgbWFpbigpIHsKICBTaGFwZSogeCA9IG5ldyBDaXJjbGUoKTsKICBTaGFwZSogeSA9IG5ldyBDaXJjbGUoKTsKICBTaGFwZSogeiA9IG5ldyBSZWN0YW5nbGUoKTsgCiAgc3RkOjpjb3V0PDwiMS0tLS0tIjw8c3RkOjplbmRsOyAKICB4LT5vdmVybGFwKHkpOwogIG92ZXJsYXAoeCwgeSk7CiAgc3RkOjpjb3V0PDwiMi0tLS0tIjw8c3RkOjplbmRsOyAKICB4LT5vdmVybGFwKHopOwogIG92ZXJsYXAoeCwgeik7CiAgCiAgcmV0dXJuIDA7Cn0=