C++ 将父类强制转换为子类以避免冗余

C++ 将父类强制转换为子类以避免冗余,c++,inheritance,parent-child,virtual-functions,C++,Inheritance,Parent Child,Virtual Functions,我有以下与数学/几何相关的课程:MathLine,MathPoint,MathVector,MathPlane 在其中的每一个上,都可以执行旋转和平移变换。因此,我创建了一个名为GeometricObject的父类,可以在几何空间中变换对象 现在,我能够为每个子类创建具有不同实现的纯虚拟类函数。现在,我想要一个通用函数,它可以接受GeometricObject,但“巧妙地”返回我实际输入的类型。例如,我有以下函数将几何对象旋转到不同的坐标系: GeometricObject rotate_obj

我有以下与数学/几何相关的课程:
MathLine
MathPoint
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\u ptr
)或强制转换(
dynamic\u 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.

这就是模板的用途。最好将旋转函数实现为一个模板,可以直接对四个子类中的任何一个子类进行操作


如果这不可行,另一个不太受欢迎但仍然可以接受的选项是使用此旋转函数并将其包装在转发其参数的facade模板中,然后从旋转函数中获取返回值,将其强制转换为适当的类型,然后返回它。

只要你的方法在母类中是虚拟的,如果你调用它们,它就会自动调用实现。
您的代码可能如下所示:

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\u object\u to\u global\u coordination\u system
并向其传递
MathLine
,它将自动调用其旋转函数的实现


如果您对其他对象遵循相同的规则,则对
MathPoint
MathPlane
等对象也会执行相同的操作。

我很确定我已经检查了此项,但它不起作用。这就是为什么我首先发布这个问题。不过,我会再次检查并让您知道。谢谢大家!@RandyArdywibowo发布你的代码,如果你想直接得到帮助。