ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 9장 7번 8번
    C++ 2018. 11. 6. 18:24

    7~8 사각형에 내접하는 도형을 표현하기 위한 Shape 클래스가 있다.


    class Shape {
    protected:
        string name; // 도형의 이름
        int width, height; // 도형이 내접하는 사각형의 너비와 높이
    public:
        Shape(string n = "", int w = 0, int h = 0) {
            name = n; width = w; height = h;
        }
        virtual double getArea() { return 0; } // dummy 값 리턴
        string getName() { return name; } // 이름 리턴
    };


    7. Shape 클래스를 상속받아 타원을 표현하는 Oval, 사각형을 표현하는 Rect, 삼각형을 표현하는 Triangular 클래스를 작성하라. main()을 작성하고 실행하면 다음과 같다.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Shape {
    protected:
        string name; // 도형의 이름
        int width, height; // 도형이 내접하는 사각형의 너비와 높이
    public:
        Shape(string n = "", int w = 0, int h = 0) {
            name = n; width = w; height = h;
        }
        virtual double getArea() { return 0; } // dummy 값 리턴
        string getName() { return name; } // 이름 리턴
    };
    class Oval : public Shape {
    public:
        Oval(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return 3.14*width*height; }
    };
    class Rect : public Shape {
    public:
        Rect(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return width*height; }
    };
    class Triangular : public Shape {
    public:
        Triangular(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return width*height/2; }
    };
    int main() {
        Shape *p[3];
        p[0] = new Oval("빈대떡", 10, 20);
        p[1] = new Rect("찰떡", 30, 40);
        p[2] = new Triangular("토스트", 30, 40);
        for (int i = 0; i < 3; ++i)
            cout << p[i]->getName() << " 넓이는 " << p[i]->getArea() << endl;
        for (int i = 0; i < 3; ++i) delete p[i];
    }


    가상 함수를 사용하여 각 도형의 특성에 맞게 함수들을 구현하여 출력합니다.

    함수의 이름은 같지만 도형의 넓이를 구하는 공식이 다르기 때문에, 파생 클래스에서 구현을 하면 파생 클래스에 맞는 함수를 실행합니다.


    8. 문제 7에 주어진 Shape 클래스를 추상 클래스로 만들고 문제 7을 다시 작성하라.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Shape {
    protected:
        string name; // 도형의 이름
        int width, height; // 도형이 내접하는 사각형의 너비와 높이
    public:
        Shape(string n = "", int w = 0, int h = 0) {
            name = n; width = w; height = h;
        }
        virtual double getArea() = 0;
        string getName() { return name; } // 이름 리턴
    };
    class Oval : public Shape {
    public:
        Oval(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return 3.14*width*height; }
    };
    class Rect : public Shape {
    public:
        Rect(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return width*height; }
    };
    class Triangular : public Shape {
    public:
        Triangular(string n, int w, int h) : Shape(n, w, h) {}
        double getArea() { return width*height/2; }
    };
    int main() {
        Shape *p[3];
        p[0] = new Oval("빈대떡", 10, 20);
        p[1] = new Rect("찰떡", 30, 40);
        p[2] = new Triangular("토스트", 30, 40);
        for (int i = 0; i < 3; ++i)
            cout << p[i]->getName() << " 넓이는 " << p[i]->getArea() << endl;
        for (int i = 0; i < 3; ++i) delete p[i];
    }


    실행결과



    추상 클래스는 하나 이상의 순수 가상 함수를 가지는 클래스입니다.

    따라서, getArea() 함수를 순수 가상 함수로 만들면 됩니다.

    'C++' 카테고리의 다른 글

    명품 C++ 9장 10번  (0) 2018.11.07
    명품 C++ 9장 9번  (0) 2018.11.07
    명품 C++ 9장 6번  (2) 2018.11.06
    명품 C++ 9장 5번  (0) 2018.11.06
    명품 C++ 9장 3번 4번  (0) 2018.11.06

    댓글

© 2018 TISTORY. All rights reserved.