I'm sure someone else will be better at explaining your first few questions, because I'm generally bad at explaining things. But I can however provide a suggestion for your last question:
Wouldn't the logical solution be to have a Shape(Named it Shape instead of Thing) class like this?:
Code:
class Shape {
public:
virtual ~Shape();
virtual void Draw() = 0;
};
Then the derived classes like this:
Code:
class Rectangle : public Shape {
public:
Rectangle( int left, int top, int right, int bottom );
void Draw();
private:
int left_, top_, right_, bottom_;
};
class Triangle : public Shape {
public:
Triangle( int x1, int y1, int x2, int y2, int x3, int y3 );
void Draw();
private:
int x1_, y1_, x2_, y2_, x3_, y3_;
};
Then if you want to move these around, add a pure virtual "Move" or "Translate" function to the base class, taking offset parameters x and y, and then implement these in the derived classes? Similarly for rotation and scaling functions. And of course you can just follow the same procedure I used for the Triangle and Rectangle example for other shapes, such as circles for example.
I know I didn't fill in the function bodies, but it should be pretty simple. Also, consider making the Draw function const, because there shouldn't be any logical reason for a Draw function to change the state of the Shape should there?