#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class A {
public:
virtual void show() { cout<<"A"<<endl; }
virtual void collide(shared_ptr<A> a) { cout<<"collide A with "; a->show(); }
virtual ~A() {}
};
class B : public A {
public:
void show() override { cout<<"B"<<endl; }
void collide(shared_ptr<A> a) override { cout<<"collide B with "; a->show(); }
};
class C : public A {
public:
void show() override { cout<<"C"<<endl; }
void collide(shared_ptr<A> a) override { cout<<"collide C with "; a->show(); }
};
//bool C::CheckCollision(shared_ptr<B> box);
//bool B::CheckCollision(shared_ptr<C> triangle);
int main() {
vector<shared_ptr<A>> objects;
objects.push_back (make_shared<A>());
objects.push_back (make_shared<B>());
objects.push_back (make_shared<C>());
for (int i = 0; i < objects.size(); i++)
{
objects[i]->show();
for (int j=i; j < objects.size(); j++)
{
objects[i]->collide(objects[j]);
//objects[i].CheckCollision(objects[j]);
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmNsYXNzIEEgewpwdWJsaWM6IAogICAgdmlydHVhbCB2b2lkIHNob3coKSB7IGNvdXQ8PCJBIjw8ZW5kbDsgfSAKICAgIHZpcnR1YWwgdm9pZCBjb2xsaWRlKHNoYXJlZF9wdHI8QT4gYSkgeyBjb3V0PDwiY29sbGlkZSBBIHdpdGggIjsgYS0+c2hvdygpOyAgfSAKCiAgICB2aXJ0dWFsIH5BKCkge30KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CnB1YmxpYzoKCXZvaWQgc2hvdygpIG92ZXJyaWRlIHsgY291dDw8IkIiPDxlbmRsOyB9IAogICAgdm9pZCBjb2xsaWRlKHNoYXJlZF9wdHI8QT4gYSkgb3ZlcnJpZGUgeyBjb3V0PDwiY29sbGlkZSBCIHdpdGggIjsgYS0+c2hvdygpOyAgfSAKfTsKCmNsYXNzIEMgOiBwdWJsaWMgQSB7CnB1YmxpYzoKCXZvaWQgc2hvdygpIG92ZXJyaWRlIHsgY291dDw8IkMiPDxlbmRsOyB9IAogICAgdm9pZCBjb2xsaWRlKHNoYXJlZF9wdHI8QT4gYSkgb3ZlcnJpZGUgeyBjb3V0PDwiY29sbGlkZSBDIHdpdGggIjsgYS0+c2hvdygpOyAgfSAKfTsKCi8vYm9vbCBDOjpDaGVja0NvbGxpc2lvbihzaGFyZWRfcHRyPEI+IGJveCk7Ci8vYm9vbCBCOjpDaGVja0NvbGxpc2lvbihzaGFyZWRfcHRyPEM+IHRyaWFuZ2xlKTsKCgoKCmludCBtYWluKCkgewoJdmVjdG9yPHNoYXJlZF9wdHI8QT4+IG9iamVjdHM7IAoJb2JqZWN0cy5wdXNoX2JhY2sgKG1ha2Vfc2hhcmVkPEE+KCkpOyAKCW9iamVjdHMucHVzaF9iYWNrIChtYWtlX3NoYXJlZDxCPigpKTsgCglvYmplY3RzLnB1c2hfYmFjayAobWFrZV9zaGFyZWQ8Qz4oKSk7IAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLnNpemUoKTsgaSsrKQogICAgewogICAgCW9iamVjdHNbaV0tPnNob3coKTsgCiAgICAgICAgZm9yIChpbnQgaj1pOyBqIDwgb2JqZWN0cy5zaXplKCk7IGorKykKICAgICAgICB7CiAgICAgICAgCW9iamVjdHNbaV0tPmNvbGxpZGUob2JqZWN0c1tqXSk7CiAgICAgICAgICAgIC8vb2JqZWN0c1tpXS5DaGVja0NvbGxpc2lvbihvYmplY3RzW2pdKTsKICAgICAgICB9CiAgICAgCn0KcmV0dXJuIDA7Cn0=