我有一个问题,我们需要有许多形状,例如圆形和方形,它们可以放置在平坦的二维平面上。所有形状,例如 Circle 和 Square,都继承自一个抽象基类 Shape;因此,我有一个指向形状的指针 vector 。
但是,我需要能够遍历平面并找到任何碰撞的形状,以便它们相交或接触。如果我从 vector 中得到一个形状,我不知道它是 Square 还是 Circle,因为它已经被切片到 Shape 基类。
我如何最好地解决这个问题?
#ifndef Plane_h
#define Plane_h
#include <vector>
#include "Shape.h"
class Plane {
public:
Plane(std::vector<Shape*>);
Plane(const Plane&);
~Plane();
void add(Shape*);
std::vector<Shape*> all() const;
protected:
std::vector<Shape*> shapes;
};
#endif
最佳答案
您的类(class)尚未切片。 这会产生一个切片对象:
vector<Shape> vec;
Circle circ;
vec.push_back(circ);
http://en.wikipedia.org/wiki/Object_slicing
在您的实例中,实例化对象保持完整并且指针指向整个对象 - 但几乎可以肯定的是,为了计算交集,您需要进行一些向下转换。虽然应该尽可能少地这样做,但这本身并不是犯罪。
你最好的选择是在基类中提供一个方法来返回一个指示对象类型的值——可能使用枚举——并使用它来向下转换特定的 Shape
指针或引用指向正确派生类型的指针/引用。
Shape
基类中的抽象方法,如 bool Intersects( const Shape& obj )
可以被派生类覆盖,覆盖将参数向下转换为正确的派生类类型。
或者,您可能更愿意提供一个采用两种形状的全局/静态方法,或者私下实现该方法并从实例方法 Intersects()
(检测交叉点并不是一项简单的任务。:-))
关于c++ - 如何遍历基类对象的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286140/