在C ++中的混合对象列表中使用相同的方法

时间:2017-03-21 11:04:13

标签: c++

编辑:感谢您的意见 - 我已经意识到这比我想象的要明显得多!

假设我有许多类,所有类都继承自一个基类。假设我们从ShapeCircleSquare继承了它。 Shape类有一个虚拟方法getArea(),然后在CircleSquare中定义。

我想创建一个圆形和方形对象列表,然后依次调用列表中每个对象上的函数getArea()

是否可以将SquareCircle类混合到这样的单个列表对象中?如果我这样做,那么是否可以遍历列表中的对象,并在每个类中调用相同的命名方法?

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

假设Shape是一个多态基(即它有一个或多个虚函数,派生类可以覆盖),那么它是可能的。

例如;

  #include <vector>
  #include <memory>

   // definitions of Shape, Circle, Square, etc

  int main()
  {
      std::vector<std::unique_ptr<Shape>> shapes;

      shapes.push_back(new Circle);
      shapes.push_back(new Square);
      for (auto &s : shapes)
      {
           s->getArea();
      } 

       //   when shapes ceases to exist, so do the objects it contains
      return 0;
  }

上面Shape还有一个虚拟析构函数。

请注意unique_ptr是C ++ 11或更高版本。根据您的需要,您可能希望使用其他智能指针(如shared_ptr)。

答案 1 :(得分:0)

在我发布这个问题之后,我开始记起C ++是如何工作的! 我为自己写了一个例子供将来参考 - 希望它对其他人来说很方便!

#include <iostream>
#include <math.h>

class Shape
{
    public:
        virtual unsigned int getArea() = 0;
};

class Circle: public Shape
{
    public:
        unsigned int getArea(){
            return M_PI * radius * radius;
        }
        int getPerimeter(){
            return 2 * M_PI * radius;
        }
    private:
        unsigned int radius = 5;
};

class Square: public Shape
{
    public:
        unsigned int getArea(){
            return side*side;
        }
    private:
        unsigned int side = 5;
};

int main(void)
{
    Circle circle1, circle2;
    Square square1, square2;
    Shape *shapes[] = {&circle1, &square1, &circle2, &square2};
    int idx;

    std::cout << "Hello!" << std::endl;

    for(idx = 0; idx < 4; idx++){
        std::cout << "Shape " << idx << " area is: "
            << shapes[idx]->getArea() << std::endl;
    }
    std::cout << "Circle1's perimeter is: "
        << circle1.getPerimeter() << std::endl;
}