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 등등 을 비교할 수 없을까요?

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

  • 2016년 05월 27일에 작성됨
    컴퓨터공학과 재학중인 학생입니다.

조회수 240


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년 05월 30일에 작성됨
    시원한 날만 일하자

  • 채택이 늦어서 죄송합니다!!    이혁준   2016.9.29 17:04     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close