对于用动态连接库导出的一些感悟

探讨DLL设计中导出接口的重要性,特别是如何通过合理的面向对象设计解决多继承带来的问题,确保良好的封装性和易用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一个动态连接库,必然会有导出的东西.虽然动态连接库本身可以导出函数,类,变量,但是导出类和变量一般都不建议使用,一方面导出类和变量的时候回把库内的一些封装结构暴露给用户,另一方面,使用导出类的用户必须也使用C++语言.因此我们通常都只导出函数.

 

但是如果运用面向对象的方法,一般都需要dll的用户可以去使用dll中创建的对象,为了不直接导出c++类,我们就得提供导出对象的接口.用C++实现的话,接口一般就是包括一些纯虚函数的结构体.我们使用一个工厂类返回这个对象关于这个接口的指针.

 

然而,加入接口也会带来新的问提,其中最严重的问题就是,接口的引入必然的引入了多继承的关系,而且这种多继承关系中经常会出现多个相同接口被继承的关系. 下面给出一个例子:

 

                                CParent                                                         IParent

                                      |                                                                    |

                            -----------------                                                 ----------------

                           |                     |                                               |                   |

                     CChild1            CChild2                                    IChild1          IChild2

                             

                                  图(1)                                                                 图(2)

 

图(1)为内部实现的继承关系,图(2)为接口的继承关系,合并这两种关系后得到的是下图的一种网状关系:

 

                                                        IParent

                                                             |

                                                  --------------------------------------

                                                  |                      |                      |

                                            CParent           IChild1              IChild2

                                                  |                      |                      |

                                                  -------------------                       |

                                                  |            |                                |

                                                  |      CChild1                           |

                                                  |                                             |

                                                  --------------------------------------

                                                                          |

                                                                     CChild2

这时向上转化二义性的问题尤为严重.

 

为了解决这种问题,我所使用的方法是:

1.使接口间的继承关系必须是单继承(这点非常重要,因为你不可能要求用户去用你的库的时候还得去从你的设计角度考虑,先把对象转成什么,再把对象转成什么)

2.需要在实现类中加入接口虚函数的重写.这些重写必须要把父实现类的实现都搬过来,然后自己也可以添加.

3.在除了该类本身的辅助函数外的函数中,都使用接口,而不是类指针.(这点是最重要的,因为这样可以避免相同对象用指针比较时由于指针不是同一个对象的指针而产生比较时发现不同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值