[英]In C++, casting to subclasses for overloaded functions?
因此,情況如下:
我有一個用於raytracer程序的抽象超類“模型”,各種幾何都可以從該模型繼承屬性和函數。 顯然,將沒有類型模型的對象,但是將有一個類型模型的數組,其中將存儲場景的整個幾何形狀。
然后,光線跟蹤器將投射許多光線。 每條射線將遍歷此模型數組,並使用自己的方法Ray :: intersect檢查是否與它們碰撞。 因此,Ray的聲明大致包括以下內容:
Point intersect(Sphere sphere) {...}
Point intersect(Cube cube) {...}
Point intersect(Torus torus) {...}
等等
問題是,由於所有這些類都繼承自Model,並且數組的類型為model,因此在訪問元素時,元素的類型為model。 模型沒有相交,所以我不會像沒有方法錯誤那樣得到錯誤的方法錯誤。 所以問題是:如何將每個成員轉換為適當的類型?
有沒有合理的方法可以做到這一點,還是我必須嘗試為每個對象顯式地轉換每個子類,並使用任何棍子? 對於似乎是常見問題的情況,這似乎是非常棘手的。
您應該反過來做。 每個模型都應該具有如下功能: virtual Point intersect(const Ray& ray) const
而不是使Ray與Point intersect(Sphere sphere)
等。
PS。 另外,請確保您的數組是Model *數組或某種形式的智能指針,否則將對Models進行切片。
PPS。 真正的光線跟蹤器會找到一種將其光線聚集在一起的方法,因此您沒有那么多(虛擬)函數調用。
編輯:
同樣,可以轉換為特定的模型,但是在這種情況下使用它會破壞OOP外觀,並導致難看的switch語句。 例如,假設您有一個Model* model
,並且您認為它可能是Sphere*
,那么您可以這樣做: Sphere* sphere = dynamic_cast<Sphere*>(model);
。 如果model
確實是Sphere*
,那么sphere
現在將指向它,否則sphere
將為NULL
。 IMO,您應該嘗試避免在幾乎所有情況下都使用dynamic_cast
; 如果您發現必須使用它,通常表明您的設計混亂了(重新設計,或者如果您沒有時間,請從錯誤中吸取教訓)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.