《COM本质论》第一章学习(2)

(《COM本质论》中的例子)

采用抽象类作为二进制接口。

class IFastString
{
public:
 virtual int Length(void) const = 0;
 virtual int Find(const char *psz) const = 0;
};
实现类从接口继承。

class FastString :public IFastString
{
public:
 FastString(const char *psz);
 ~FastString(void);

 int Length(void) const;
 int Find(const char *psz) const;

private:
 const int m_cch;
 char *m_psz;
};

FastString::FastString(const char *psz)
:m_cch(strlen(psz)),m_psz(new char[m_cch + 1])
{
 strcpy(m_psz,psz);
}

FastString::~FastString(void)
{
 delete []m_psz;
}

int FastString::Length(void) const
{
 return m_cch;
}

int FastString::Find(const char *psz) const
{
 return 0;
}

 

这样也还是必须包含实现类,因为抽象类必须靠实现类来实例化,解决方法是提供一个全局函数来实例化实现类,从而隐藏实现类。

extern "C" IFastString *CreateFastString(const char *psz);用CreateFastString代替new FastString。

 

析构函数不是虚函数,因此不能动态的识别调用哪个析构函数,会造成内存泄漏,如果改为虚函数,则破坏了接口类的编译器独立性,因为虚析构函数在vtbl中的位置随编译器的不同而不同。显示的增加一个Delete方法,作为接口类的另一个纯虚函数。

class IFastString
{
public:
 virtual void Delete(void) = 0;
 virtual int Length(void) const = 0;
 virtual int Find(const char *psz) const = 0;
};

void FastString::Delete()
{
 delete this;
}

 

在动态库中,除了CreateFastString函数以外,其他的成员函数都是虚函数,通过vtbl的函数指针间接调用,因此不需要导出符号,不受“不同编译器篡改符号名称”的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值