#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;
}