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

안녕하세요.

제가 할려는 코드가,

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답변

  • 좋아요

    2

    싫어요
    채택취소하기

    여러가지 방법이 있는데요. 제일 간단한 건 이름만을 리턴하는 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
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 채택이 늦어서 죄송합니다!! 이혁준 2016.9.29 17:04

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.