使用纯虚方法复制从类继承的类?

时间:2009-11-14 18:31:00

标签: c++ inheritance polymorphism

我有一段时间没有使用过C ++,而且我对实际语言的易用性感到非常满意。

无论如何,我正在尝试实现Command模式,我需要将一些命令对象实现映射到字符串键。我有一个字符串到命令的STL映射,我想复制命令。

基本上,

Command * copiedCommand = new Command( commandImplementation );

我想保留commandImplementation的功能。由于Command具有纯虚函数execute,因此不起作用。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

一种方法是将它添加到Command类中:

public:
   virtual Command * Clone() const = 0;

...然后在Command的各个子类中,实现Clone()以返回对象的副本:

public:
   virtual Command * Clone() const {return new MyCommandSubclass(*this);}

完成后,您可以按照以下方式执行此操作:

Command * copiedCommand = commandImplementation->Clone();

答案 1 :(得分:1)

http://en.wikipedia.org/wiki/Prototype_pattern

  

原型模式是创造性的   软件中使用的设计模式   开发时的对象类型   创造是由一个决定的   原型实例,克隆   生产新物品。这种模式   习惯于:

     
      
  • 避免使用的子类   客户端中的对象创建者   应用程序,就像抽象工厂一样   模式呢。
  •   
  • 避免固有成本   在...中创建一个新对象   标准方式(例如,使用'新'   关键词)当它令人望而却步   对于给定的应用来说是昂贵的。
  •   
     

要   实现模式,声明一个   指定a的抽象基类   纯虚拟clone()方法。任何课程   需要“多态构造函数”   能力来源于   抽象基类和实现   clone()操作。

     

客户,   而不是编写调用的代码   硬编码的“新”运算符   class name,调用clone()方法   在原型上,打电话给工厂   带参数指定的方法   特定的具体派生类   期望,或调用clone()方法   通过提供的某种机制   另一种设计模式。

答案 2 :(得分:0)

如果Command是抽象类,则无法直接调用复制构造函数。相反,您可以考虑创建一个返回对象深层副本的clone()方法。这也可以是返回基类的纯虚方法,例如:

class Command {
    public:
        virtual Command* clone(void) const = 0;
};
相关问题