2016-03-29 47 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