2012-09-18 3 views
0

여기 상황은 다음과 같습니다.C++에서 오버로드 된 함수에 대한 하위 클래스로 캐스팅 했습니까?

나는 다양한 종류의 지오메트리가 속성과 기능을 상속하는 광선 추적 프로그램을위한 추상 수퍼 클래스 "모델"을 가지고 있습니다. 분명히 유형 모델의 객체는 없지만 장면의 전체 형상이 저장되는 유형 모델의 배열이 있습니다.

그러면 레이 트레이서가 여러 가지 광선을 투사합니다. 각 광선은이 배열을 반복하여 Ray :: intersect라는 자체 메서드를 사용하여 충돌하는지 확인합니다. 따라서, 레이의 선언은 약이 포함

Point intersect(Sphere sphere) {...} 

Point intersect(Cube cube) {...} 

Point intersect(Torus torus) {...} 

문제는 이러한 클래스의 모든 모델에서 상속 및 배열 형 모델이기 때문에, 요소는이 때 타입 모델이 될 것입니다 액세스되었습니다. 모델에 교차점이 없으므로 잘못된 방법 오류가 발생하지 않습니다. 문제는 다음과 같습니다. 어떻게 각 구성원을 적절한 유형으로 캐스팅 할 수 있습니까?

합리적인 방법이 있습니까, 또는 각 개체에 대해 명시 적으로 각 하위 클래스를 캐스팅하고 모든 막대기를 사용해야합니까? 이것은 공통적 인 문제처럼 보이는 것에 매우 익숙해 보입니다.

+1

'Base'에서 상속받은'Derived' 클래스가 있다면'Base :: Foo()'를 할 수없는 이유는 무엇입니까? –

+0

오버로드 된 메서드는 수퍼 유형 모델의 개체를 사용하는 다른 클래스 용 메서드입니다. bar, baz, biff가 모두 어리석은 b 단어를 상속하는 다양한 foo (bar [name]), foo (baz [name]), foo (biff [name]) 등의 여러 기능이 있습니다. 추상 수퍼 클래스. –

+0

이것은 고전적인 "이중 발송"또는 "다중 발송"시나리오입니다. 그것은 문헌에 잘 기록되어 있습니다. –

답변

1

다른 방법으로해야합니다. 레이를 Point intersect(Sphere sphere) 등으로 보내는 대신, 각 모델은 virtual Point intersect(const Ray& ray) const과 같은 기능을 가져야합니다.

추신. 옆으로, 당신의 배열이 Model * 또는 스마트 포인터의 어떤 형태의 배열인지 확인하십시오. 그렇지 않으면 모델을 분할 할 것입니다.

PPS. 실제 레이 트레이서 (ray tracer)는 광선을 함께 배치하는 방법을 발견 할 것이므로 많은 (가상) 함수 호출이 없습니다.

편집 :

또한, 특정 모델에 캐스팅 가능하지만 OOP 다움을 파괴하고 못생긴 switch 문에 발생합니다이 경우에는 그것을 사용. 예를 들어 Model* model이 있다고 가정하고 Sphere* 일 수 있다고 생각하면 다음을 수행 할 수 있습니다. Sphere* sphere = dynamic_cast<Sphere*>(model);. model이 실제로 Sphere* 인 경우 sphere이 이제이를 가리키고, 그렇지 않은 경우 sphereNULL이됩니다. IMO 거의 모든 상황에서 dynamic_cast을 사용하지 않는 것이 좋습니다. 당신이 그것을 사용해야한다는 것을 알게된다면, 그것은 보통 당신의 디자인이 엉망진창 인 (재 설계, 또는 시간이 없다면, 당신의 실수로부터 배우기) 표시입니다.

+0

정리에 대한 요점은 있지만, 이것은 단지 과제이며 첫 번째 디자인 반복입니다.팁을 주셔서 감사합니다 : 포인터, 나는 당신이했던 동일한 결론에 도달했습니다 : 일반적으로 문제입니다. 감사! –

관련 문제