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

Superclass and subclass, diffrent function calls depending on subclass

本文关键字:子类 函数调用 取决于 超类      更新时间:2023-10-16

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

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

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

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

这是我的超类

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)?

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

如果您可以使用这个参数,那么您只需覆盖子类中的函数即可。如果你想从这个替代版本调用更专业的setSize(int, int)函数,你可以写:

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

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

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

为了解决这个问题,你的第一反应是使用指向对象的指针并存储该指针。这将打开一个内存泄漏等待发生的蠕虫罐头。解决方案是存储Boost库中的智能指针。我建议你阅读比约恩·卡尔松的《超越C++标准库——Boost简介》。第1章:smart_ptr

像Paranaix一样,我在设想客户端使用类树接口时遇到了一些困难。在类似类型的"Figure"实现中,getSize()类型的函数通常返回一个边界框。超类将提供一个虚拟函数Draw()来绘制边界框内的图形。

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

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

我最好的建议是看看你的设计,试着开发一个接口,并根据这个接口进行编写。一旦接口工作正常,就编写实现。

祝你好运。