com为什么不使用虚继承??

bsnry 2012-09-24 12:04:51
两个问题

第二个才是与com相关的话题



1.

虚继承的概念问题


无论是祖父类中有虚函数或者无虚函数,

无论是祖父类中有虚函数或者无虚函数

无论是祖父类中有虚函数或者无虚函数

当2个或者2个以上的父亲类继承该祖父类,然后孙子类 为了多个祖父,

所以可以在父亲类继承祖父类的时候,加上关键字virtual修饰。 就可以避免了

多个祖父。


如果父亲类中有1个或者多个 已经override了 祖父类中的虚函数,会如何呢?








问题2: 看图,这是潘爱民的书上的截图,作者特意强调不用虚继承。

作者为什么不采用虚继承???


一般而言,至少书上的例子, 图中IDictionary, ISpellCheck 都增加了自己的虚函数。

但是没有实现 祖父类IUnknown中的虚函数!!! 我是从光盘里看了代码得出的结论。










...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶之舟 2012-09-24
  • 打赏
  • 举报
回复
好几年不写COM程序了
healer_kx 2012-09-24
  • 打赏
  • 举报
回复
IUnkonwn怎么有数据啊?不就是那三个虚函数嘛? QueryInterface,AddRef,Release嘛?
哪有数据啊。
bsnry 2012-09-24
  • 打赏
  • 举报
回复
看了2个小时你提供的文章


再回头看帖子,

Idictionary ISpellcheck 继承 IUnkown

而 CDictionary则继承 Idictionary ISpellcheck

Idictionary ISpellcheck 这个类都没有数据, IUnkown中或许有数据吧。

我们没有采用 虚继承,内存布局必然是数据重复。


只有当IUnkwon类中没数据的时候, 也就是说, 祖父类, 2个父亲类都没数据,那么

从COM对象的结构上说,前4个字节是第一个接口的指针虚表,接下去是第二个(没有数据成员),第三个接口的指针。


你说的这句话才正确!!!

你觉得呢?



  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
还有:编译器 不能保证前4个自己是虚函数表的地址。 所以 你回答啊有些牵强了。



再者:虚继承仅仅是保证祖父类只有一份而已。

你说的 祖父虚函数表和2个父亲的虚函数表 在上自身的虚函数表, 一共4张表 合并成一张。

不知道从什么地方得出的结论啊
[/Quote]
目前C++编译器都这么干的,delphi VB写出来的COM也都是这么回事。

COM规定的是二进制标准,不这么干的话就不是COM。
healer_kx 2012-09-24
  • 打赏
  • 举报
回复
嗯,帮你找了一个超级好的URL
http://blog.csdn.net/wxc1987821/article/details/5958325

看2.5章的第一个图片。。。

你看,最前的不是虚表指针了,就是因为存在虚继承。

healer_kx 2012-09-24
  • 打赏
  • 举报
回复
C++编译器确实不能保证前四是虚表指针,但是不能保证这点的,也没法编译出来COM组件。

就连VB,Delphi也得做到这点了。


另外,你不了解 虚继承的C++对象模型了,你了解一下就知道了。

bsnry 2012-09-24
  • 打赏
  • 举报
回复

还有:编译器 不能保证前4个自己是虚函数表的地址。 所以 你回答啊有些牵强了。



再者:虚继承仅仅是保证祖父类只有一份而已。

你说的 祖父虚函数表和2个父亲的虚函数表 在上自身的虚函数表, 一共4张表 合并成一张。

不知道从什么地方得出的结论啊

healer_kx 2012-09-24
  • 打赏
  • 举报
回复
更简单说就是:
COM是以二进制的方式发布的(书上原话吧?)对于VB来说,它不知道这个COM是Delphi写的,还是C++写的。就是C++,也不知是基于ATL还是MFC的。

它看到的是一块内存,它就把第一个4字节,当成是第一个接口(的虚表指针)。

如果你虚继承了,这个二进制的结构对不对了。
bsnry 2012-09-24
  • 打赏
  • 举报
回复
没有数据怎么了?

调用祖父类的函数的时候难道不会出现二义性?






[Quote=引用 3 楼 的回复:]

这是为了COM的二进制标准啊,为了让Delphi,VB也能正确的使用COM的接口指针。

说到底,是C++对象模型的问题啊。

从COM对象的结构上说,前4个字节是第一个接口的指针虚表,接下去是第二个(没有数据成员),第三个接口的指针。


如果你使用了虚继承,前四个字节就不是第一个接口的虚表指针了,而是虚基类表了。。。
具体看C++对象模型嘛。。。
-------------……
[/Quote]
healer_kx 2012-09-24
  • 打赏
  • 举报
回复
你发的书我看过了,就是我说的。基本可以结贴了。
bsnry 2012-09-24
  • 打赏
  • 举报
回复
http://img.my.csdn.net/uploads/201209/24/1348459154_5444.jpg

这是图片链接,你还是看图吧

因为首贴的图 我发现显示的不完整啊






[Quote=引用 3 楼 的回复:]

这是为了COM的二进制标准啊,为了让Delphi,VB也能正确的使用COM的接口指针。

说到底,是C++对象模型的问题啊。

从COM对象的结构上说,前4个字节是第一个接口的指针虚表,接下去是第二个(没有数据成员),第三个接口的指针。


如果你使用了虚继承,前四个字节就不是第一个接口的虚表指针了,而是虚基类表了。。。
具体看C++对象模型嘛。。。
-------------……
[/Quote]
healer_kx 2012-09-24
  • 打赏
  • 举报
回复
这是为了COM的二进制标准啊,为了让Delphi,VB也能正确的使用COM的接口指针。

说到底,是C++对象模型的问题啊。

从COM对象的结构上说,前4个字节是第一个接口的指针虚表,接下去是第二个(没有数据成员),第三个接口的指针。


如果你使用了虚继承,前四个字节就不是第一个接口的虚表指针了,而是虚基类表了。。。
具体看C++对象模型嘛。。。
--------------------------------
另外,COM的组件的多继承,也不需要虚继承,首先还得看虚继承是为了什么而被创造出来的。
你继承的都是只有函数,没有成员的基类,虚继承也没有意义啊。
bsnry 2012-09-24
  • 打赏
  • 举报
回复
继续顶,等高手

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧