问个关于 prototype 原型模式的有关问题

问个关于 prototype 原型模式的问题
设计模式一书中,给出 Prototype 原型模式的结构图中
  其中, Prototype 抽象基类有一纯虚函数 virtual Prototype * Clone() = 0;
  它的子类中 ConcretePrototype1, 及 ConcretePrototype2 都必须实现 Clone()
  原型应该是 virtual Prototype * Clone();
  
  在网上找到的其它资料中, Prototype 模式的 Clone 都是这样声明且定义的.
  
  但是, 设计模式一书中给出的迷宫示例 Maze, Clone 却不是这样声明的
  如下:
  virtual Door* Clone() const;
  virtual Room* Clone() const;
//Room 如下,设计模式书的的代码
class Room : public MapSite
{
public:
Room(int roomNo);

MapSite* GetSide(Direction) const;
void SetSide(Direction, MapSite*);

virtual void Enter();

//for prototype 
Room(const Room& other);
virtual Room* Clone() const;

private:
MapSite* _sides[4];
int _roomNumber;
};

  Room, Door 两个类相当于 ConcretePrototype1, 和 ConcretePrototype2
  为什么这里的 Clone() 的返回值却要返回自身,而不是其基类 MapSite

  即 virtual MapSite* Clone();


  我想问:Prototype, ConcreatePrototype1, ConcreatePrototype2 的 Clone 方法空间该怎样声明定义,如何在被客户调用
  网上的经典示例给出的代码太简单了,我觉得说明不了问题的本质.

------解决方案--------------------
virtual Prototype * Clone() = 0; 这是标准答案吧

因为返回类型不能用来区分重载函数类型,而且使用时子类指针能够隐式转化为基类指针

所以迷宫中的写法也是不会出错的


------解决方案--------------------
Room, Door 两个类相当于 ConcretePrototype1, 和 ConcretePrototype2
为什么这里的 Clone() 的返回值却要返回自身,而不是其基类 MapSite

即 virtual MapSite* Clone(); 

===
子类中返回类型 是基类返回类型的子类也是override.


virtual Room* Room::Clone() const{
Room * cloneRoom = new Room();
cloneRoom.roomNo = this.roomNo;
// set all other attributes
return cloneRoom;





Prototype * cp1 = new ConcreatePrototype1()
Prototype * cp2 = new ConcreatePrototype2();

cp1, cp2 做为原形 ,

cp1.clone()//就是调用 ConcreatePrototype1::clone();




------解决方案--------------------
LZ不必计较此事.
GoF书中的例子, 可能是在假设需求上, 不需要为 MapSite设计Clone方法, 当然我们来读书的时候, 完全可以像楼主这么认识. 但GoF也给出一个类似的例子, 就是BombedWall子类实现基类Wall的Clone方法. 也和MapSite中设计Clone方法是一致的.
而且GoF在说明Prototype模式时, 使用了 MazePrototypeFactory, 其实我们实战中也并非必须这么使用, 没有这个Factory, 我们照样可使用Clone方法.
我们可以灵活运用的.