본문 바로가기
프로그래밍 이야기/C++ 기초

[C++] 예제로 배우는 객체 지향 #1

by Mulder5 2020. 11. 24.
반응형

도형 그리기

모든 도형을 타입으로 설계한다.
-> 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를 가상함수로 만든다 -> 정상 동작
            }
        }
    }
}

반응형