COM基本问
为什么所有的function都是virtual函数?既然有了interface,可以取得接口地址,何苦加一个用virtual加一个vtable? 问题点数:30、回复次数:20Top
1 楼ExplorerBoy()回复于 2001-11-03 21:21:51 得分 1
vtable 可是精华,慢慢体回去吧Top
2 楼wyzegg(蛋)回复于 2001-11-04 14:23:04 得分 0
这是最重要的
Top
3 楼latakia()回复于 2001-11-04 14:30:57 得分 1
com的vtable在c++中是通过虚函数和虚拟基类来实现的。
多看看书吧!Top
4 楼zenyivon(zenyivon)回复于 2001-11-04 20:04:13 得分 1
<<深入探索C++对象模型>Top
5 楼arxing(阿行)回复于 2001-11-05 09:12:44 得分 6
vtable就是接口,你所说的“接口的地址”就是vtable的地址。Top
6 楼yver()回复于 2001-11-07 08:22:00 得分 2
class interace
{
public:
virtual HRESULT AddRef() = 0;
virtual HRESULT Release() = 0;
virtual HRESULT QueryInterface = 0;
}Top
7 楼alwzh(虚竹)回复于 2001-11-07 18:44:03 得分 1
完全同意以上观点Top
8 楼bobqi(灰冷)回复于 2001-11-07 22:26:09 得分 7
接口的作用就是指明一个vtable
然后虚函数就在了vtable中的地址
程序才懂得如何通过接口调用函数,
然后在代码复用上就能够利用这种方法
不去为接口增加函数,而是通过增加新的接口来增加函数,
这是我个人的一点理解,不过好像有些东西没有说全,
希望高手指正
Top
9 楼bobqi(灰冷)回复于 2001-11-07 22:27:01 得分 2
补充,
利用虚函数就可以使得在定义接口的时候不用过多的考虑函数
的实现细节,而到了类定义的时候再来Top
10 楼scxy(小熊)回复于 2001-11-08 09:36:12 得分 2
用virtual得到一个vtable的指针,只有地址,不必关心实现细节,这样做到实现与接口的无关性Top
11 楼kimryo(God is on my side)回复于 2001-11-14 23:14:34 得分 0
还有人说否?Top
12 楼robinswan()回复于 2001-11-15 02:42:53 得分 2
如果这样理解可能会比较清晰,如果你在内存中创建一个类的实例,也就是在内存中创建了一个内存片,普通的函数的实现代码也是存在于同一个内存块中.
但是类的虚函数的实现代码是在另外的内存块中的,所以类的实例就必须有个虚表来保存虚函数的内存段的地址,也就是指针.这就是虚表了.Top
13 楼kimryo(God is on my side)回复于 2001-11-25 00:40:45 得分 0
给分Top
14 楼echolover(盈子)回复于 2001-11-25 11:08:03 得分 2
不同意robinswan的说法,建立一个类的实例时,在内存中创建的内存片中不包含member function的代码。只有一个指向vtable的指针和data member。Top
15 楼AndrewT(河马)回复于 2001-11-26 11:17:58 得分 0
只补充一点,由于各个商业的C++编译器只有在vtable的格式上是一样的,所以采用虚函数声明接口,就可以实现接口的编译器无关性。这对COM是很重要的。Top
16 楼lixiner(大汤姆狼)回复于 2001-11-26 11:27:08 得分 0
在C++的虚拟函数可以完美的实现com的接口特性!
不一定非要用,例如C语言,只要能实现
接口的标准就行了Top
17 楼kimryo(God is on my side)回复于 2001-12-16 16:35:03 得分 0
还有,ATL的接口类的ATL_NO_VTABLE是什么意思?Top
18 楼finalwish(gogo)回复于 2001-12-16 19:23:52 得分 2
对于COM的继承问题,对于microsoft是个难题,由于com中有个vtable,这对于本地机的COM的继承来说很容易解决,直接调用父接口的vtable,但对于远程COM的继承来说,这就是不现实的。
所以microsoft只好用了一个替代品聚合来模拟继承。Top
19 楼lisush(西木)回复于 2001-12-24 15:35:36 得分 1
建议去看《深入浅出MFC》
这本书对多态和虚拟有比较精彩的介绍Top
20 楼yoshiyan(耀奇(冬季限定版))回复于 2001-12-27 08:53:26 得分 0
ATL_NO_VTABLE就是告诉编译器不要为你要定义的类生成VTABLE了,这样可使代码小些.Top




