好的,標題很滿意,我認爲這可能是爲什麼它很難通過谷歌或本網站找到答案。這可能只是我不知道如何正確表達問題,但這裏有:將重載函數匹配到其多態參數
我在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++中做不同的事情來實現它嗎?
謝謝,
Gary。
謝謝。我以前沒有使用過這種模式。我猜這在Java中可能不常見。我做了一些測試,我想我可能會回到'dynamic_cast'解決方案。我希望有更優雅的東西,但雙派/訪客模式似乎引入了我不太喜歡的各種依賴和緊密耦合。 –