所以情況如下:在C++中,轉換爲重載函數的子類?
我有一個抽象超類「模型」的光線追蹤程序,從中各種幾何形狀繼承屬性和功能。顯然不會有類型模型的對象,但是會有一個類型模型的數組,其中將存儲場景的整個幾何圖形。
然後一些光線將由光線追蹤器投射。每條射線將遍歷這個模型數組,並檢查它是否使用它自己的方法Ray :: intersect與它們碰撞。因此,Ray的聲明大致包括這樣的:
Point intersect(Sphere sphere) {...}
Point intersect(Cube cube) {...}
Point intersect(Torus torus) {...}
等
問題是,因爲所有這些類從模型繼承,並且陣列是類型的模型,所述元件將是類型的模型的時候都訪問。模型沒有交集,所以我不會得到一個錯誤的方法錯誤,就像沒有這樣的方法錯誤一樣。所以問題是:我如何將每個成員轉換爲適當的類型?
是否有合理的方法來做到這一點,或者我必須爲每個對象明確地投射每個子類,並且使用任何支柱?這看起來似乎是一個常見問題,這似乎很駭人聽聞。
如果你有一個從'Base'繼承的'Derived'類,爲什麼你不能只是做'Base :: Foo()'? –
重載的方法用於接受超類型模型的對象的不同類。因此,一系列foo(bar [name]),foo(baz [name]),foo(biff [name])等函數,其中bar,baz和biff都從愚蠢的b字繼承而來抽象超類。 –
這是經典的「雙派遣」或「多派遣」方案。它在文獻中有很好的記錄和寫作。 –