Pimpl成语与纯虚拟类接口?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我想知道什么能让程序员选择Pimpl成语或纯虚拟类和继承。

我知道pimpl习语为每个公共方法和对象创建开销带来了一个明确的额外间接方向。

另一方面,纯虚拟类为继承实现提供了隐式间接(vtable),并且我明白,不会产生对象创建开销。

提问于
用户回答回答于

在编写C ++类时,应该考虑是否会出现这种情况

  1. 值类型 按价值复制,身份永远不重要。它适合作为std :: map中的一个键。例如,“字符串”类或“日期”类或“复数”类。“复制”这样的类的实例是有意义的。
  2. 实体类型 身份是重要的。始终通过引用传递,而不是“值”。通常,根本无法“复制”课程的实例。当它有意义时,多态“克隆”方法通常更合适。示例:一个Socket类,一个数据库类,一个“策略”类,在功能语言中可以是“闭包”的任何东西。

pImpl和纯粹的抽象基类都是减少编译时间依赖性的技术。

不过,我只使用pImpl来实现值类型(类型1),并且有时仅在我真正想要最小化耦合和编译时相关性时。通常情况下,这是不值得的。正如您正确地指出的那样,由于您必须为所有公共方法编写转发方法,因此存在更多的语法开销。对于类型2类,我总是使用纯粹的抽象基类和相关的工厂方法。

用户回答回答于

Pointer to implementation通常是关于隐藏结构实现细节。Interfaces是关于实例化不同的实现。他们真的有两个不同的目的。

扫码关注云+社区