您的位置:首页 > 其它

ATL实战开发指南笔记-----2.1

2014-05-07 23:16 183 查看
COM可以用vb,java,C++语言进行编写,它只关心组件的功能,与语言无关。可以把组件编译成dll的格式或者exe格式。

COM的鲁棒性----可以对com组件进行升级,使旧的程序仍然能够运行,而新的程序可以利用组件的新特性。

COM的位置透明性------客户机不需要知道组件的存放的位置

COM也有面向对象的特性----封装继承多态

组件需要提供接口给外部使用--------------------------所以它有一个可爱的名字:服务器(server)

而使用组件的软件实体-----------被迫只能喊为:客户机(client)

COM的主要工作是解决接口的实现和使用等问题

这是C++的对外接口

classIMath
{
virtualintAdd(inta,intb)=0;
virtualintSubtract(inta,intb)=0;

};
用户可以使用它的接口来实现自己的代码
COM也是和它差不多的,他们之间的其他差异在于:
1----COM的语言无关性
2----COM的位置透明性
#include<string>
#include<iostream>

classFruit
{
public:
virtualvoidDraw(){}
private:
std::stringm_strcolor;
};

classApple:publicFruit
{
virtualvoidDraw()
{
std::cout<<"Iamanapple\n";
}
};

classGrannySmith:publicApple
{
virtualvoidDraw()
{
std::cout<<"IamaGrannysmithApple\n";
}
};

classbanana:publicFruit
{
virtualvoidDraw()
{
std::cout<<"Iamanbananana\n";
}
};
classorange:publicFruit
{
virtualvoidDraw()
{
std::cout<<"Iamanorange\n";
}
};

intmain()
{
Fruit*f[5];
f[0]=newApple;
f[1]=newGrannySmith;
f[2]=newbanana;
f[3]=neworange;
f[4]=neworange;
for(inti=0;i<5;i++)
{
f[i]->Draw();
}
return0;
}


输出结果:

Iamanapple
IamaGrannysmithApple
Iamanbananana
Iamanorange
Iamanorange
上面就是C++的一个简单的多态例子。这里利用虚函数和动态绑定
如果你使 Fruit中的虚函数Draw,变成纯虚函数。则这个类就变为了抽象类,那么派生类必须实现它
 virtualvoidDraw()=0;
C++是使用虚表(vtable)来实现动态绑定的,COM也是使用C++中的虚表结构来建立组件的接口。因为虚表是一个包含函数地址的数组。
因为COM使用了一个vtable指针,所以COM接口中只能提供方法。
//下一章:既然如此相似,那么如何从一个C++的类转变到COM组件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: