C++ 오버라이딩, 다형성

조회수 2582회

안녕하세요.

제가 할려는 코드가,

class Shape { 
   protected: 
   int  type; // POINT, CIRCLE, RECTANGLE, or TRIANGLE 
   public: 
   virtual double area()=0; 
   virtual bool isContaining(const Point&)=0; 
   enum {POINT, CIRCLE, RECTANGLE, TRIANGLE}; 
   friend bool operator==(const Shape&, const Shape&); 
}; 
class Rectangle : public Shape { 
   Point rightUpper, leftLower; 
   public: 
   Rectangle(const Point&, const Point&); 
   bool isContaining(const Point&); 
   … 
} 
class Circle : public Shape { 
   Point Center; 
   double radius; 
   public: 
   Circle(const Point&, double); 
   bool isContaining(const Point&); 
   … 
}; 
class Triangle : public Shape { 
   Point p1, p2, p3; 
   public: 
   Triangle(const Point&, const Point&, const Point&); 
   bool isContaining(const Point&); 
   … 
}; 

이렇게, Shape를 상속하는 Point, Rectangle, Circle, Triangle 클래스 들과,

 class ShapeSet {
Shape** shapes;
int      numShapes;
int      maxShapes;
public:
...
};

이 Shape들을 담는 ShapeSet이라는 클래스입니다.

코딩하다가 막힌점이, class Shape에서 friend bool operator==(const Shape&, const Shape&); 부분입니다. 두 Shape이 같은지 다른지 판별할려면,

Shape의 멤버데이터 type이 아니라 Point라면 그 멤버데이터 x,y를 비교하고, Rectangle이라면 그 멤버데이터 rightUpper, leftLower를 비교하는 등 Rectangle Circle Point Triangle 모두 다른 방식으로 구현해야 할건데

operator==의 파라미터의 타입을 다 Shape으로 해놓은 상태에서 Triangle과 Triangle, Rectangle과 Rectangle 등등 을 비교할 수 없을까요?

파생클래스를 파라미터로 쓸때 베이스클래스는 올수있지만 그 반대는 안된다고 배웠습니다ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 여러가지 방법이 있는데요. 제일 간단한 건 이름만을 리턴하는 virtual 메소드를 만드는겁니다.

    예를들면 다음과 같이 가상 메소드 name() 을 만들어 ==를 오버라이딩 할때 name()을 비교하는 방식으로 짤 수 있습니다.

    #include<iostream>
    using namespace std;
    
    class Base{
    public:
        virtual string name() const = 0; //이름을 리턴하는 가상 메소드
    };
    
    class Sub1 : public Base{
    public:
        string name() const {
            return "Sub1";
        }
    };
    
    class Sub2 : public Base{
    public:
        string name() const {
            return "Sub2";
        }
    };
    
    
    int main(){
        Sub1* sub1 = new Sub1();
        Sub2* sub2 = new Sub2();
    
        Base* base1 = sub1;
        Base* base2 = sub2;
    
        cout << base1->name() << endl; //"Sub1"를 출력
        cout << base2->name() << endl; //"Sub2"를 출력
    
    }
    

    출력결과 :

    Sub1
    Sub2
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)