2016-03-29 45 views
2

我有以下有關數學/幾何的類:MathLineMathPoint,MathVector,MathPlane將父類轉換爲子類以避免冗餘

關於這些,您可以進行旋轉和平移變換。所以我創建了一個名爲GeometricObject的父類,它可以在幾何空間中進行轉換。

現在,我能夠爲每個子類不同的實現創造了純虛函數的類。現在,我想這可能需要GeometricObject,但「智能」地返回什麼類型的我居然把在一般的功能。例如,我有以下的功能,旋轉的幾何對象,以不同的座標系:

GeometricObject rotate_object_to_global_coordinate_system(GeometricObject object) { 
    object.rotateX(90); // Pure virtual functions 
    object.rotateY(90); 
    object.rotateZ(90); 

    return object; 
} 

如果我輸入一個MathLine,我期望該函數「投射」到MathLine中,執行MathLine實現我的虛函數,並返回MathLine

我到處搜索過這個,看起來這可以通過使用指針(auto_ptr)或鑄造(dynamic_cast)來完成。這看起來不太好,因爲我已經讀過,這是一個不好的方法,因爲它會犧牲一些顯着的性能。它也似乎是一種高級編程語言應該具備的簡單功能。這可以做到嗎?

我覺得對我來說要做到這一點,否則,我會寫不同的功能,基本上執行相同的虛擬功能不同的子類這是非常重要的。我將不得不寫:

MathLine rotate_line_to_global_coordinate_system(MathLine object); 
MathPoint rotate_point_to_global_coordinate_system(MathPoint object); 
MathPlane rotate_plane_to_global_coordinate_system(MathPlane object); 
// etc. 

回答

0

這是模板的用途。優選地,將您的旋轉功能實現爲可以直接在四個子類中的任何一個上操作的模板。

如果這樣做不可行,另一個不太可取,但仍然是最容易接受的選項是採用此循環函數並將其包裝在轉發其參數的外觀模板中,然後從循環函數獲取返回值,將其轉換爲適當的類型,然後返回它。

0

只要你的方法是在媽媽級虛擬,如果你給他們打電話,就會自動調用執行。
您的代碼可能是以下幾點:

class GeometricObject 
{ 
    virtual void rotateX(float angle) = 0; 
    virtual void rotateY(float angle) = 0; 
    virtual void rotateZ(float angle) = 0; 
}; 

然後,任何功能繼承此類必須實現的這些功能:

class MathLine : public GeometricObject 
{ 
    void rotateX(float angle) { /* Implementation */ } 
    void rotateY(float angle) { /* Implementation */ } 
    void rotateZ(float angle) { /* Implementation */ } 
}; 

現在,如果你打電話給你的功能rotate_object_to_global_coordinate_system並傳遞給它的MathLine,它會自動調用它的旋轉函數的執行。

如果你跟隨其他對象相同的規則,它會爲MathPointMathPlane做的一樣,等

+0

我敢肯定,我檢查了這一點,這是行不通的。這就是爲什麼我把這個問題放在第一位。但是,我會仔細檢查並通知您。謝謝! –

+0

@RandyArdywibowo如果您需要直接幫助,請發佈您的代碼。 – Aracthor