C++ 超类和子类,不同的函数调用取决于子类

C++ 超类和子类,不同的函数调用取决于子类,c++,polymorphism,subclass,conditional-statements,superclass,C++,Polymorphism,Subclass,Conditional Statements,Superclass,这个问题已经解决了一段时间,似乎找不到任何答案 我想要有基类(图)和一些子类(圆、三角形等)。然后我想要一个向量包含不同种类的子类 问题是,我所有的子类都有大小,但它们的描述方式不同 圆只需要半径,三角形需要底面和高度,正方形需要宽度和高度 这是我的超类 class Figure { public: //This function should take diffrent amount of values virtual void setSize(); //More awe

这个问题已经解决了一段时间,似乎找不到任何答案

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

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

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

这是我的超类

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; }
};
这些是示例子类

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; }
};

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

就这么简单:如果你的类没有任何共同点,继承就不会工作。 你预计会发生什么?如果我输入
base->setSize(3)
作为
三角形
你期望什么行为

但是,如果可以使用此参数,则必须重写子类中的函数。如果您想在此覆盖版本中调用更专业的
setSize(int,int)
函数,您可以编写:

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

当然,这只是一个示例,在将参数传递到更专门的方法之前,您可以对参数执行任何操作。

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

为了避免这种情况,你的第一反应是使用指向对象的指针并存储该指针。这将打开一罐等待内存泄漏的蠕虫。解决方案是存储Boost库中的智能指针。我建议你阅读Bjoern Karlsson的《超越C++标准库——Boost》的介绍。第1章:智能ptr

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

正如Pananaix所指出的,多态函数的思想是,该函数表示一个狭义的概念,该概念在派生类中以不同的方式实现。(这是接口与实现原则的分离)

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

我最好的建议是看看你的设计,试着开发一个接口,并针对该接口编写代码。接口工作后,编写实现


祝你好运。

如果它们没有相同的参数类型,则不会-这是实际代码吗?因为如果是这样的话,你就永远不会从你的Figure类中获得多态性行为-没有对
setSize()
的重写,因为它们都有不同的参数。你应该尝试找到另一个属性来描述你的多态性对象:那么
virtualvoid Figure::setScale(double)呢
虚拟void setXYRatio(double,double)
您可以使用默认参数作为攻击,而忽略其他参数。对于C++11,如果多态行为是唯一目标(例如,不需要共享所有权),则应该使用
std::unique\u ptr
而不是Boost智能指针。