簡體   English   中英

在C ++中,是否重載為重載函數的子類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM