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

来源:互联网 发布:编程语音排行榜 编辑:程序博客网 时间:2024/05/16 19:31

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

 

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

 

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

 

                                CParent                                                         IParent

                                      |                                                                    |

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

                           |                     |                                               |                   |

                     CChild1            CChild2                                    IChild1          IChild2

                             

                                  图(1)                                                                 图(2)

 

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

 

                                                        IParent

                                                             |

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

                                                  |                      |                      |

                                            CParent           IChild1              IChild2

                                                  |                      |                      |

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

                                                  |            |                                |

                                                  |      CChild1                           |

                                                  |                                             |

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

                                                                          |

                                                                     CChild2

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

 

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

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

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

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

原创粉丝点击