How about making the sprites have a common base?

Code:
class DrawingControl {
public:
  virtual void draw( /* whatever allegro specific args here, like surface and postion */)=0;
  virtual ~DrawingControl;
};

class SpriteControl : public DrawingControl {
public:
  SpriteControl(std::string filename);
  void draw(/* args */);
  ~SpriteControl();
private:
  // whatever ya need
};
  
class AnimationControl : public DrawingControl {
public:
  AnimationControl(std::string filename);
  void draw(/* args */);
  ~AnimationConrol();
private:
 // whatever
};
The filenames in each constructor should be the names of files that contain the appriopriate data. For example, SpriteControl perhaps has some stuff like transparency, clipping information, and a single bitmap file name. It only is capable of drawing one bitmap however. The animation file could contain things like rate of animation, number of frames, followed by number of SpriteControl filenames, and could internally have an array( or preferablly, a std::vector) of SpriteControls.

Each type of drawing file should then have a specific extension, say .sc for SpriteControl, and .ac for Animation control, then you could write a function

Code:
// leaves caller responsible for deletion
DrawingControl* allocateControl(std::string filename) {
  string extension = filename.substr(filename.rfind('.'));
  if (extension == ".ac") {
    return new AnimationControl(filename);
  } else if (extension == ".sc") {
    return new SpriteControl(filename);
  }
  return NULL;
}
Then, you could have say, some player class

class Player {
public:
Player();
~Player();
void draw() {
switch (movementDirection) {
case MOVE_LEFT: leftImage->draw();break;
case MOVE_RIGHT: rightImage->draw(); break;
// handle rest
}
}

private:
Direction movementDirection;
SomeLocationClass a;
DrawingControl* leftImage;
DrawingControl* rightImage;
DrawingControl* downImage;
DrawingControl* upImage;
};

The player could be loaded from a file that contained 4 DrawingControls, each would be allocated with allocateControl, and you could easily change how the player behaves by just changing the data file... adding another DrawingControl subclass wouldn't break your code either, as you would just have to add the DrawingControl subclass, and then add another extension to allocateDrawingControl.

With this method, you do lose some things, however. You can't tell a DrawingControl to pause. But you could simply use two DrawingControls to do that. For example, say you have an image for the player moving to the right, and another for the player sitting idle. The idle picture could be an animationless SpriteControl, while the movement can be animated with a AnimationControl. When you draw the player moving, you call the moveRight->draw(), but when he is not moving, you call the idle->draw().

Least, that's how I am doing my drawing system in BomberLAN .

Good luck.