반응형
도형 그리기
모든 도형을 타입으로 설계한다.
-> Rect, Circle
모든 도형의 공통의 기반 클래스가 있다면 모든 도형을 하나의 컨테이너에 담아서 관리 할 수 있다.
->기반 클래스 Shape 추가
모든 도형의 공통 특징은 반드시 기반 클래스에도 있어야 한다.
-> Draw함수는 Shape에도 있어야 한다.
파생 클래스에서 재정의된 함수는 반드시 가상 함수로 만든다.
#include <iostream>
#include <vector>
using namespace std;
class Shape
{
public:
virtual void Draw() { cout << "Draw Shape" << endl; }
};
class Rect :public Shape
{
public:
// 오버라이드 된 가상 함수는 Virtual 키워드를 생략가능하지만 되도록 명시 해주는 것이 좋다.
virtual void Draw() { cout << "Draw Rect" << endl; }
};
class Circle : public Shape
{
public:
virtual void Draw() { cout << "Draw Circle" << endl; }
};
int main()
{
// Rect, Circle을 모두 하나의 vector에 넣을 방법은? -> 공통의 기반 클래스를 만들자!
//vector<??> v;
vector<Shape*> v;
while (1)
{
int cmd;
cin >> cmd;
if (cmd == 1) v.push_back( new Rect );
else if (cmd == 2) v.push_back( new Circle );
else if (cmd == 9)
{
for (auto p : v)
{
p->Draw(); // Error -> p는 Shape. Shape에는 Draw()가 없다.
// 모든 도형의 공통 특징은 기반 클래스에도 있어야 하겠다.
// --> 그럼에도 불구하고 이것만으로는 각자의 클래스의 Draw가 아니라 모두 Shape의 Draw()가 호출된다.
// --> 그렇다면 기반 클래스의 Draw를 가상함수로 만든다 -> 정상 동작
}
}
}
}
반응형
'프로그래밍 이야기 > C++ 기초' 카테고리의 다른 글
[C++]Design Pattern - 변하는 것을 분리하기 (0) | 2020.12.01 |
---|---|
[C++] 예제로 배우는 객체 지향(Prototype Pattern) (0) | 2020.11.25 |
[C++] Protected Contructor (0) | 2020.11.24 |
[C++]Casting, Virtual function (0) | 2020.11.24 |
Range based for (0) | 2020.09.09 |