상속과 다형성 실습(도형, 점, 선, 면적, 사각형) [디딤돌 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;
}
프로그래밍 언어 및 기술 학습, 무료 동영상 강의 언제나 휴일 티스토리
'C++ > 디딤돌 C++' 카테고리의 다른 글
[C++ 소스] 학생 클래스 (연산자 중복정의 하기 전) (0) | 2016.12.14 |
---|---|
상속과 다형성 실습-학생, 마법학생, 운동학생, 학사학생[C++] (0) | 2016.05.15 |
상품과 할인 상품 - 상속과 다형성 실습 [디딤돌 C++] (0) | 2016.04.17 |
기본 형식 간에 static_cast [디딤돌 C++] (0) | 2016.04.17 |
static_cast [디딤돌 C++] (0) | 2016.04.17 |