C++ 代理类/句柄vs子类
可能重复:C++ 代理类/句柄vs子类,c++,C++,可能重复: 在隐藏实现方面,我读了很多关于“代理类”或“句柄类”或“柴郡猫微笑”技术的书,在这些技术中,基本上在公共/代理类中包含指向“真实”类的指针作为数据成员,然后在“真实”类中实现所有内容 但是我看了一些示例代码,发现了另一种似乎更简单的技术,因为它不需要在handle类中编写“虚拟”方法来调用handle类中的实际方法,也不需要任何数据成员,而且总体上看起来更为精简 该技术只是将所有公共方法定义为一个结构(或一个类,其中所有内容都是公共)和所有虚拟=0成员函数。因此,没有实施。然后,定
在隐藏实现方面,我读了很多关于“代理类”或“句柄类”或“柴郡猫微笑”技术的书,在这些技术中,基本上在公共/代理类中包含指向“真实”类的指针作为数据成员,然后在“真实”类中实现所有内容 但是我看了一些示例代码,发现了另一种似乎更简单的技术,因为它不需要在handle类中编写“虚拟”方法来调用handle类中的实际方法,也不需要任何数据成员,而且总体上看起来更为精简 该技术只是将所有公共方法定义为一个
结构
(或一个类,其中所有内容都是公共
)和所有虚拟=0
成员函数。因此,没有实施。然后,定义一个静态函数,返回指向该结构的指针,以便客户端可以使用该类。但是在幕后,这个方法实际上返回了结构的一个子类,在这个子类中,您可以进行更多的操作
如果这非常简单,而且我认为它比包含指向单独类的指针的数据成员的公共类更优雅,并且必须实现公共类对数据成员方法的调用,那么为什么这不是隐藏实现中讨论最多的技术呢?如上所述:
大多数人推荐PIMPL方法的原因是它有一些明显的优点:
- 不需要工厂函数,可以使用new()、delete()或
在堆栈上创建对象李>
- 您可以轻松地创建子类李>
- 接口方法不是虚拟的,因此调用它们可能是虚拟的
更快。(另一方面,我们需要额外的内存获取才能访问
实现对象。)
- 可以在现有类中引入PIMPL,而无需更改其
外部接口或其与其他类的关系
抽象类方法有其自身的一些优点:
- 更干净的代码和更少的键入,因为我们不必编写
转发公共接口中方法的存根
- 多个类可以实现同一个接口。我们可以静态地
或者动态选择要使用的特定实现,
这给了我们更多的灵活性
你可能想在检查时问这个问题,他最后确实列出了一些优点。@Karthik谢谢你的两个参考资料,它们确实很有用。COM就是这样工作的。在Windows上很有名。