// 의미: 자식에게 반드시 특정함수를 만들게 하는것!
// Abstract Base Class 추상기반클래스
// 강한결합 tightly compling 값에 의한 전달!
// 약한결합 loosely compling 인터페이스에 의한 결합
// 사람과 전화기 제조업자가 지켜야 하는 계약서를 먼저 만든다. ( interface, contract )
// 인터페이스 설계의 중요성 : 확장성, 변화에 유연해 진다.
// 구현 부분이 없기 때문에 메모리를 잡지 않는다.
#define interface struct      //왠지 의미전달이 제대로 된다.멋있음.!!!
interface IPhone
{
        virtual void Calling( char* num ) = 0;
};
class IMP3Play
{
public:
        virtual void MP3Play() = 0;
};
//---------------------------------------------------------------
// 계약에 따른 전화기를 사용하는 객체
class People
{
public:
        void UsePhone( IPhone* p )    { p->Calling("119"); }
};
// 모든 전화기는 IPhone 인터페이스를 구현해야(상속 받아서 순수가상함수 재정의) 한다.
class AnyCall : public IPhone
{
public:
        void Calling( char* ) {}
};
void main()
{
        People p;
        AnyCall a;
        p.UsePhone( &a );
}