【问题标题】:Superclass and subclass, diffrent function calls depending on subclass超类和子类,不同的函数调用取决于子类
【发布时间】:2013-12-28 14:05:41
【问题描述】:

被这个问题困扰了一段时间,似乎找不到任何答案!

我想要基类(图)和一些子类(圆形、三角形等)。然后我想要一个向量包含不同种类的子类。

问题是,我所有的子类都有大小,但它们的描述方式不同。

圆形只需要半径,三角形需要底边和高度,正方形需要宽度和高度。

这是我的超类

class Figure {
  public:
    //This function should take diffrent amount of values
    virtual void setSize();
 //More awesome stuff here
}

这些是示例子类

class Circle {

  public:
      //This is a circle, only needs radius as size
     void setSize( int _radius ) { radius = _radius; }

 };

class Triangle {

   public:
   //This is a triangle, it needs both a base and height
    void setSize( int _base, int _height ) { base = _base; height = _height; }
};

所以现在如果我从我的 Figure* 调用 getSize() 并且它指向一个 Circle 对象,是否有办法让我的超类知道它应该调用的 Circle 类中的 setSize(double)?

【问题讨论】:

  • 如果它们没有相同的参数类型,则不是 - 这是实际代码吗?因为如果是这样,您将永远不会从 Figure 类中获得多态行为 - 没有 setSize() 的覆盖,因为它们都有不同的参数。
  • 你应该尝试找到另一个属性来描述你的多态对象:virtual void Figure::setScale(double);virtual void setXYRatio(double,double) 怎么样
  • 您可以使用默认参数作为 hack,而忽略其他参数。

标签: c++ polymorphism subclass conditional-statements superclass


【解决方案1】:

就这么简单:如果您的类没有任何共同点,那么继承将不起作用。 你期望会发生什么?如果我输入base->setSize(3) 作为Triangle,您期望什么行为?

如果您可以使用此参数,您只需在子类中覆盖该函数。如果您想从此覆盖版本调用更专业的 setSize(int, int) 函数,您可以编写:

void setSize(int _radius) {
    setSize(_radius, _radius);
}

这当然只是一个例子,你可以在将参数传递给你更专业的方法之前对参数做任何你想做的事情。

【讨论】:

    【解决方案2】:

    警告,警告:如果将派生类存储在向量中,则会对对象进行切片。请记住,STL 使用复制来移动数据成员。因此,如果您有一个vector<superclass> 并尝试存储一个子类对象,STL 会将您的对象的超类部分复制到它自己的内存中并留下您的专长。

    要解决这个问题,您的第一反应是使用指向对象的指针并存储该指针。这将打开一罐蠕虫,内存泄漏正等待发生。解决方案是从 Boost 库中存储一个智能指针。我建议你阅读 Bjoern Karlsson 的“Beyond the C++ Standard Library – An Introduction to Boost”。第一章:smart_ptr

    与 Paranaix 一样,我很难想象客户端使用您的类树接口。在类似的“Figure”类型实现中,getSize() 类型函数通常返回一个边界框。超类将提供一个虚函数 Draw() 来绘制该边界框内的图形。

    正如 Pananaix 所指出的,多态函数的概念是,函数代表了一个窄界概念,在派生类中以不同的方式实现。 (这就是接口和实现原理的分离)

    在您的设计中,客户必须知道对象的类型才能调用/解释一个函数 getSize() 的结果。 (对于要返回/设置边的三角形,对于圆形,半径)这不是要走的路。

    我最好的建议是查看您的设计并尝试开发一个界面并针对该界面进行编写。一旦接口工作,编写实现。

    祝你好运。

    【讨论】:

    • 对于 C++11,如果多态行为是唯一的目标(例如,不需要共享所有权),则应该使用 std::unique_ptr 而不是 Boost 智能指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多