接口内存模型

来源:互联网 发布:蔡英文执政能力 知乎 编辑:程序博客网 时间:2024/04/27 20:18

《COM原理与应用》笔记

  COM对象往往有自己的属性数据,这些属性数据反映了对象的状态,正是通过这些属性数据,反映了此对象与彼对象的不同。例如,字典对象有一个字典数据表m_pData成员和字典文件名m_DictFilename作为其基本的属性数据。用C++语言来实现字典对象:
  class CDictionary : public IDictionary
  {
  public:
    CDictionary();
    ~CDictionary();
    virtual BOOL Initialize();
    virtual BOOL LoadLibrary(String);
    virtual BOOL InsertWord(String, String);
    virtual void DeleteWord(String);
    virtual BOOL LookupWord(String, String *);
    virtual BOOL RestoreLibrary(String);
    virtual void FreeLibrary();
  private:
    struct DictWord *m_pData;
    char *m_DictFilename[128];
  };
  按照类CDictionary的定义,接口IDictionary和字典对象的内存结构变成图2.4。

 

  如果一个客户使用了两个字典对象,则显然两个字典对象公用了成员函数,但数据属性是不能公用的,根据C++中class的基本编译原理,这时内存结构如图2.5所示。

 

  如果第二个字典组件对象没有采用CDictionary类的结构来实现其字典功能,但也实现了IDictionary接口,则此时内存结构与图2.5又有所不同,如图2.6所示。

 

  以上给出的三个模型图中,每个接口成员函数都包含一个this指针,通过该this指针,接口成员函数可以访问到字典对象的属性数据。按照CDictionary的定义方法,该this指针指向CDictionary类的对象,因此,在虚函数中可以直接访问CDictionary的数据成员。
  实际上,也可以采用其他的方法来实现接口,只要接口成员函数中this指针(接口指针)与对象数据能建立确定的连接,在接口成员函数中可以访问到对象数据即可。例如MFC和ATL分别采用了不同的机制来提供对COM接口的支持。

 

原创粉丝点击