C++ 代理类/句柄vs子类

C++ 代理类/句柄vs子类,c++,C++,可能重复: 在隐藏实现方面,我读了很多关于“代理类”或“句柄类”或“柴郡猫微笑”技术的书,在这些技术中,基本上在公共/代理类中包含指向“真实”类的指针作为数据成员,然后在“真实”类中实现所有内容 但是我看了一些示例代码,发现了另一种似乎更简单的技术,因为它不需要在handle类中编写“虚拟”方法来调用handle类中的实际方法,也不需要任何数据成员,而且总体上看起来更为精简 该技术只是将所有公共方法定义为一个结构(或一个类,其中所有内容都是公共)和所有虚拟=0成员函数。因此,没有实施。然后,定

可能重复:

在隐藏实现方面,我读了很多关于“代理类”或“句柄类”或“柴郡猫微笑”技术的书,在这些技术中,基本上在公共/代理类中包含指向“真实”类的指针作为数据成员,然后在“真实”类中实现所有内容

但是我看了一些示例代码,发现了另一种似乎更简单的技术,因为它不需要在handle类中编写“虚拟”方法来调用handle类中的实际方法,也不需要任何数据成员,而且总体上看起来更为精简

该技术只是将所有公共方法定义为一个
结构
(或一个类,其中所有内容都是
公共
)和所有
虚拟=0
成员函数。因此,没有实施。然后,定义一个静态函数,返回指向该
结构的指针,以便客户端可以使用该类。但是在幕后,这个方法实际上返回了结构的一个子类,在这个子类中,您可以进行更多的操作

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

如上所述:

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

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

  • 更干净的代码和更少的键入,因为我们不必编写 转发公共接口中方法的存根
  • 多个类可以实现同一个接口。我们可以静态地 或者动态选择要使用的特定实现, 这给了我们更多的灵活性

你可能想在检查时问这个问题,他最后确实列出了一些优点。@Karthik谢谢你的两个参考资料,它们确实很有用。COM就是这样工作的。在Windows上很有名。