// 1. 부모* = &자식 
// 2. 1.이 주로 어떻게 활용 되는가??
// 장점 : 동일한 기능 부여!!, 모든 type을 저장하는 컬렉션 제공.
class object
{
};
class Animal
{
public:
        int age;
};
class Dog : public Animal{};
class Cat : public Animal{};
// Dog와 Cat의 객체를 받기 위해서는 오버로딩으로 두번 써주지만..
// 부모를 이용하면 간단해진다.
void NewYear( Dog* p )
{
        p->age++;
}
void NewYear( Cat* p )
{
        p->age++;
}
/////////////////////////////////////////////
//void NewYear( void* p ) // 모든 type을 받을 수 있지만 구분을 못한다.(?)
void NewYear( Animal* p ) //모든 동물의 객체를 처리 할 수 있다.
{
        p->age++;
}
{
        Dog d;
        NewYear( &d );
        Cat c;
        NewYear( &c );
//      int* p2 = new Dog;            // error
        Animal* p3 = new Dog;  // ok.. 부모* = &자식
        Dog d2;
        Animal& r4 = d2;       // ok.
        Animal o = d2; // ok.  liskov Substitution 리스코프의치환법칙.
}
//////////////////////////////////////////////////////////////////////////
class object
{
};
class list
{
        struct Node
        {
               object* data;
               Node*   next;
        };
public:
        void Add( object* ob)
        {
               cout << "list::Add()" << endl;
        }
};
class Car : public object
{
};
class People : public object
{
};
// Car 전용Collection 을설계하자.
// strong type Collection - Adapter 패턴을활용해서만든것.
class Carcollection
{
        list st;
public:
        void Add( object* p ) { st.Add( p ); }
};
void main()
{
        Carcollection st;
        Car c;
        st.Add( &c );          // ok. 어짜피object의자식이다.
        People p;
        st.Add( &p );          // ok. People도object의자식이다.
}