1

可能重复:
Pimpl idiom vs Pure virtual class interface

在隐藏实现中,我已经阅读了很多关于“代理类”或“处理类”或“柴郡猫微笑”技术的内容,其中您基本上包含指向“真实”类的指针作为公共/代理类中的数据成员,然后在“真实”类中实现所有内容。

但是我正在查看一些示例代码,并注意到另一种似乎更容易的技术,因为它不需要您还在句柄类中编写“虚拟”方法然后调用句柄类中的真实方法,也不需要它根本需要任何数据成员,而且总体上看起来更加精简。

该技术是将所有公共方法简单地定义为一个struct(或一切都在的类public)和所有virtual=0成员函数,仅此而已。因此没有实现。然后,定义一个返回指向 this 的指针的静态函数,struct以便客户端可以使用该类。但是在幕后,这个方法实际上返回了结构的一个子类,然后你可以在这个子类中做更多的事情。

如果这很简单,而且我认为它比包含一个指向单独类的指针的数据成员的公共类更优雅,并且必须实现公共类对数据成员方法的调用,那么为什么这不是隐藏实现中讨论最多的技术?

4

1 回答 1

0

本文所述

大多数人推荐 PIMPL 方法的原因是它具有一些明显的优势:

  • 不需要工厂函数,您可以使用 new()、delete() 或在堆栈上创建对象。
  • 您可以轻松地进行子类化。
  • 接口方法不是虚拟的,因此调用它们可能会更快。(另一方面,我们需要额外的内存获取来获取实现对象。)
  • PIMPL 可以在现有类中引入,而无需更改其外部接口或与其他类的关系。

抽象类方法有它自己的一些优点:

  • 更简洁的代码和更少的输入,因为我们不必为公共接口中的方法编写转发存根。
  • 多个类可以实现同一个接口。我们可以静态或动态地选择我们想要使用的特定实现,这给了我们更大的灵活性。
于 2013-01-23T05:13:32.163 回答