You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classShape{
public:enum ShapeColor {Red, Green, Blue};
// 모든 도형은 자기 자신을 그리는 함수를 제공해야 한다.virtualvoiddraw(ShapeColor color = Red) const = 0;
};
classRectangle: publicShape{
public:// 기본 매개변수가 다르다.virtualvoiddraw(ShapeColor color = Green) const;
};
classCircle: publicShape{
public:virtualvoiddraw(ShapeColor color) const;
};
Shape * ps;
Shape * pr = new Rectangle;
Shape * pc = new Circle;
ps, pr, pc는 Shape에 대한 포인터로 선언되어 있기 때문에, 정적 타입도 모두 Shape에 대한 포인터 타입이다.
실제 가리키는 대상이 달라지는것은 하나도 없다.
객체의 동적 타입
현재 객체가 진짜로 무엇이냐에 따라 결정되는 타입
객체가 어떻게 동작할 것이냐를 가리키는 타입
pc의 동적 타입은 Circle*이고, pr의 동적 타입은 Rectangle*, ps의 동적 타입은 없다.
ps = pc; // ps의 동적 타입은 Circle*가 된다.
pc->draw(Shape::Red); // Circle::draw(Shape::Red)를 호출한다.
ps = pr; // ps의 동적 타입은 Rectangle*가 된다.
pr->draw(Shape::Red); // Rectangle::draw(Shape::Red)를 호출한다.
pr->draw(); // Rectanble의 기본 매개변수는 Green으로 위에서 설정해 두었지만 Rectangle::draw(Shape::Red)를 호출한다.
pr의 동적 타입은 Rectangle*이므로 호출되는 가상 함수는 Rectangle의 것이다.
pr의 정적 타입은 Shape*이므로 호출되는 가상 함수에 쓰이는 기본 매개변수 값을 Shape 클래스에서 가져온다.
파생 클래스에 정의된 가상 함수를 호출하면서 기본 클래스에 정의된 기본 매개변수 값을 사용해버릴 수 있다.
Shape 및 Rectangle 클래스 양쪽에서 선언된 것이 한데 섞이는 이상한 함수 호출이 이루어진다.
classShape{
public:enum ShapeColor {Red, Green, Blue};
voiddraw(ShapeColor color = Red) const// draw는 비가상 함수가 된다.
{
doDraw(color); // 가상 함수를 호출한다.
}
private:virtualvoiddoDraw(ShapeColor color) const = 0; // 진짜 작업이 이루어 지는 함수
};
classRectangle: publicShape{
public:private:virtualvoiddoDraw(ShapeColor color) const; // 기본 매개변수 값이 없다.
};