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

时间:2016-03-29 01:33:34

标签: c++ inheritance parent-child virtual-functions

我有以下与数学/几何有关的课程:MathLineMathPointMathVectorMathPlane

在其中每个上,您都可以执行旋转和平移转换。所以我创建了一个名为GeometricObject的父类,这些对象可以在几何空间中进行转换。

现在,我能够为每个子类创建具有不同实现的纯虚拟类函数。现在,我想要一个可以采用GeometricObject的一般功能,但是"聪明地"返回我实际放入的类型。例如,我有以下函数将Geometric对象旋转到不同的坐标系:

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.

2 个答案:

答案 0 :(得分:0)

这就是模板的用途。最好将旋转功能实现为一个模板,该模板可以直接在四个子类中的任何一个上运行。

如果这不可行,另一个不太优选但仍然是最容忍的选项是采用这个旋转函数并将其包装在转发其参数的外观模板中,然后从旋转函数中获取返回值,将其转换为适当的类型,然后返回它。

答案 1 :(得分: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等也会执行相同的操作。