C++/디딤돌 C++

상속과 다형성 실습(도형, 점, 선, 면적, 사각형) [디딤돌 C++]

언제나휴일 2016. 5. 14. 21:14
반응형

상속과 다형성 실습(도형, 점, 선, 면적, 사각형) [디딤돌 C++]

상속과 다형성 실습(도형, 점, 선, 면적, 사각형)


//상속과 다형성 실습 2(도형)

#include <iostream>

using namespace std;

 

class Diagram

{

    static int last_id; //가장 최근에 부여한 ID (정적 멤버)

    const int id; //ID (상수화 멤버)

public:

    Diagram():id(++last_id)//상수화 멤버 초기화

    {

    }

    virtual void Draw()=0;//순수 가상 메서드

protected:

    int GetID()const //ID 접근자

    {

        return id;

    }

};

 

int Diagram::last_id; //정적 멤버 필드 선언

 

class Point:public Diagram

{

    int x,y;

public:

    Point(int x,int y)

    {

        this->x = x;

        this->y = y;

    }

    virtual void Draw()//재정의

    {

        cout<<GetID()<<" ("<<x<<","<<y<<")"<<endl;

    }

};

 

class Line:public Diagram

{

    Point *p1;

    Point *p2;

public:

    Line(int x1,int y1, int x2,int y2)

    {

        p1 = new Point(x1,y1);

        p2 = new Point(x2,y2);

    }

    virtual void Draw()//재정의

    {

        cout<<GetID()<<" "<<endl;

        cout<<"  ";

        p1->Draw();

        cout<<"  ";

        p2->Draw();

    }

};

 

#define interface struct

interface IGetArea //인터페이스

{

    virtual int GetArea()const=0; //순수 가상 메서드

};

 

class Rectangle: public Diagram, public IGetArea

{

    int left, top, right, bottom;

public:

    Rectangle(int left, int top, int right, int bottom)

    {

        this->left = left;

        this->top = top;

        this->right = right;

        this->bottom = bottom;

    }

     virtual void Draw()//재정의

     {

         cout<<GetID()<<" 사각형";

         cout<<"("<<left<<","<<top<<")"<<"("<<right<<","<<bottom<<")"<<endl;

     }

     virtual int GetArea()const//재정의

     {

         int width = right- left;

         if(width<0) //폭이 음수일 때

         {

             width = -width; //양수로 전환

         }

 

         int height = right-left;

         if(height<0) //폭이 음수일 때

         {

             height = -height; //양수로 전환

         }

         return width * height;

     }   

};

 

void TestGetArea(IGetArea *iga)

{

    cout<<면적:"<<iga->GetArea()<<endl;;

}

 

int main()

{

    Diagram *diagrams[3];

    diagrams[0] = new Point(3,4);

    diagrams[1] = new Line(0,0,5,5);

    diagrams[2] = new Rectangle(0,0,10,10);

    for(int i = 0; i<3; i++)

    {

        diagrams[i]->Draw();

        IGetArea *iga = dynamic_cast<IGetArea *>(diagrams[i]);

        if(iga)

        {

            TestGetArea(iga);

        }       

    }

    for(int i = 0; i<3; i++)

    {

        delete diagrams[i];

    }

    return 0;

}

 


프로그래밍 언어 및 기술 학습, 무료 동영상 강의 언제나 휴일 티스토리

프로그래밍 언어 및 기술 학습, 무료 동영상 강의는 언제나 휴일 티스토리


반응형