复制从具有纯虚拟方法的类继承的类?

Posted

技术标签:

【中文标题】复制从具有纯虚拟方法的类继承的类?【英文标题】:Copying a class that inherits from a class with pure virtual methods? 【发布时间】:2009-11-14 18:30:59 【问题描述】:

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

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

基本上,

Command * copiedCommand = new Command( commandImplementation );

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

【问题讨论】:

你能显示更多代码吗?我看不出你的问题的瓷砖与身体有什么关系。 ;-) 字符串到命令指针的 STL 映射,你的意思是? 真的...我的意思是来一个!即使你不喜欢 C++,说它不是一门真正的语言... 我的意思不是说它不能用于制作真正的应用程序。它这样做的能力是空洞的。我的意思是它与我曾经选择解决问题的任何语言都不相同。对于实时系统,C/C++ 可能总是更快,但技术已经向我们表明,即使是游戏和视频渲染应用程序也将很快迁移到虚拟机。天哪,还记得《雷神之锤 2》何时成为热门游戏吗?它现在在我的浏览器中运行:P。 【参考方案1】:

一种方法是将其添加到您的 Command 类中:

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

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

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

完成后,你可以像这样做你想做的事:

Command * copiedCommand = commandImplementation->Clone();

【讨论】:

我敢打赌 Go 会让这更优雅。【参考方案2】:

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

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

避免子类 客户端中的对象创建者 应用程序,例如抽象工厂 模式可以。 避免固有成本 在 标准方式(例如,使用“新” 关键字)当它被禁止时 对于给定的应用程序来说很昂贵。

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

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

【讨论】:

【参考方案3】:

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

class Command 
    public:
        virtual Command* clone(void) const = 0;
;

【讨论】:

以上是关于复制从具有纯虚拟方法的类继承的类?的主要内容,如果未能解决你的问题,请参考以下文章

您可以强制从抽象基类继承的类仅具有在基本情况下定义的公共方法吗?

从继承的类中覆盖虚拟方法但保留基类的注释[重复]

如何在python中注册从抽象类继承的类

为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?

从具有非虚拟父级的虚拟类继承的正确方法

获取从抽象类继承并在属性中具有特定值的类的实例