C++ 오버라이딩, 다형성
조회수 2594회
안녕하세요.
제가 할려는 코드가,
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
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력