좋아요, 제목은 한 마디로, 아마도 Google 또는이 사이트를 통해 답변을 찾는 것이 어려웠던 것 같습니다. 그냥 올바르게 문제를 표현하는 방법을 모르겠지만 여기에 간다 :오버로드 된 함수를 해당 다형성 인수와 일치 시키십시오.
SimpleOpenGLRenderer
클래스의 일련의 메서드는 모두 Model
클래스를 확장하는 단일 인수를가집니다. 따라서 모델의 유형에 따라 렌더러는 렌더링 방법을 알고있는 올바른 메서드를 호출합니다.
#include <stdio.h>
class Model {};
class Cube : public Model {};
class Sphere : public Model {};
class Renderer
{
public:
virtual void renderModel(const Model& model) = 0;
};
class SimpleOpenGLRenderer
{
public:
void renderModel(const Cube& model)
{
printf("Render the cube.\n");
}
void renderModel(const Model& model)
{
printf("Throw an exception, my renderer does not support the model type you have provided.\n");
}
void renderModel(const Sphere& model)
{
printf("Render the sphere.\n");
}
};
int
main(int argc, char** argv)
{
Cube cube;
Model& model = cube;
SimpleOpenGLRenderer renderer;
renderer.renderModel(cube);
renderer.renderModel(model);
}
예제의 출력은 다음과 같습니다 : 여기에 문제를 기반으로 단순화 된 실행 예입니다
Render the cube.
Throw an exception, my renderer does not support the model type you have provided.
계획대로이 작동하지 않는 것을 더 노련한 C++ 개발자에게 명백한 것처럼 보일 수 있습니다
하지만, 그것은 단지 나에게 이해가되지 않는다. 런타임에 렌더러에 전달 된 Model
의 정확한 유형을 알 수 없습니다 (따라서이를 해결하기 위해 오버로드를 시도 함). Java 백그라운드에서 왔을 때, 저는이 기술을 Java에서 사용했습니다. 호출 된 메소드는 런타임 인수의 유형과 가장 일치하는 메소드입니다. C++에서는 참조가 컴파일 타임 유형과 일치하는 것으로 보입니다. 비록 그 참조가 내 생각에 다른 함수와 더 잘 일치하는 하위 클래스가 될지라도.
지금까지 필자는이 런타임 유형을 당연하게 받아 들였습니다. 그것은 단순히 C++에 존재하지 않습니까? 아니면 잘못된 방향으로 가고 있습니까? 그것을 달성하기 위해 C++에서 다르게해야할까요?
감사합니다.
게리.
감사합니다. 나는 그 패턴을 전에 사용하지 않았다. Java에서는별로 일반적이지 않을 수도 있습니다. 몇 가지 테스트를했는데 아마'dynamic_cast' 솔루션으로 넘어갈 것입니다. 나는 더 우아한 무언가를 원했지만 double-dispatch/visitor 패턴은 온갖 종류의 의존성과 밀접한 커플 링을 소개하는 것처럼 보였습니다. –