免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3406 | 回复: 14
打印 上一主题 下一主题

[C++] 请问个C++中多重继承的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-23 08:33 |只看该作者 |倒序浏览
我在看COM时,发现每个接口都是从IUnknown继承来的,
该接口都有QueryInterface虚函数,那么最后COM类中
的每个vtable中都要实现该函数,我现在模拟了个:
class IA
{
public:
   virtual void dsp()=0;
};


class B:public IA
{
public:
    virtual void dsp()=0;
};

class C:public IA
{
public:
    virtual void dsp()=0;
};


class cls:public B,public C
{
public:
        void dsp(){printf("I dont know\n");}
};
可是最后类cls只实现了一个dsp函数,那么该函数
到底是属于class B还是class C中的dsp函数?
还是说这两个函数都指向同一个地方呢?
能说说理由吗?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2013-04-23 09:26 |只看该作者
B和C中的不是都声明为纯虚函数了吗

论坛徽章:
0
3 [报告]
发表于 2013-04-23 09:41 |只看该作者
我的意思是class cls里面有两个dsp函数,它们分别来自B和C,现在我不知道在class cls里的
dsp函数是实现哪个类中的函数:是B还是C?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2013-04-23 10:15 |只看该作者
目前的编译器的实现机制是通过查询虚函数表来得到真实的函数入口地址,LZ这种情况下,两个类的虚函数表中dsp都将指向同一个入口地址,也就是说dsp既是B的又是C的。

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-04-23 10:15 |只看该作者
儿子和女儿舌乚人仑出来的不是自己的孙子么。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2013-04-23 10:27 |只看该作者
就这个例子而言,只要你不通过IA*去调用cls实例中的dsp,不会有什么问题,比如:

  1. IA*p=new cls();
  2. p->dsp();   // Compilation error
复制代码
不过还是强烈建议你仔细看看virtual inheritance的文档

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
7 [报告]
发表于 2013-04-23 10:32 |只看该作者
本帖最后由 cokeboL 于 2013-04-23 10:56 编辑

实现的当然是cls中的,本类只实现本类的,怎么能实现别的类的。

只能说是这个接口继承自哪个,B和C都是继承了IA的dsp()纯虚接口,cls实现了,那么通过B、C的指针或引用都可以
对cls中的dsp()接口进行调用。

论坛徽章:
0
8 [报告]
发表于 2013-04-23 10:41 |只看该作者
w_anthony 发表于 2013-04-23 10:15
目前的编译器的实现机制是通过查询虚函数表来得到真实的函数入口地址,LZ这种情况下,两个类的虚函数表中ds ...

为什么说两个类的虚函数表中dsp都将指向同一个入口地址?能具体说说吗?

论坛徽章:
0
9 [报告]
发表于 2013-04-23 11:01 |只看该作者
本帖最后由 sonicling 于 2013-04-23 11:04 编辑

B和C中的dsp就是IA的dsp,只不过BC可能应该实现它,但是它们把实现dsp的责任推给了cls。这个dsp还是IA的dsp,BC中的纯虚dsp写不写都一样。

如果你把BC的dsp都换成另外一个名字,比如dsp1,才会引发你所问的问题。COM中一般不存在这种情况,COM中任意两个接口不存在同名虚函数 (可能有,但使用有限制)。

论坛徽章:
0
10 [报告]
发表于 2013-04-23 11:54 |只看该作者
cokeboL 发表于 2013-04-23 10:32
实现的当然是cls中的,本类只实现本类的,怎么能实现别的类的。

只能说是这个接口继承自哪个,B和C都是继 ...


一、实现的当然是cls中的,本类只实现本类的,怎么能实现别的类的。
===================
问题是:clsl类中有两个vtable中都有函数dsp,一个来自B类,一个来自C类,
所以我才不知道cls中实现的是哪个类中的dsp函数?

二、只能说是这个接口继承自哪个,B和C都是继承了IA的dsp()纯虚接口,cls实现了,那么通过B、C的指针或引用都可以
对cls中的dsp()接口进行调用
=================
那么如果是cls obj;
obj.dsp()是哪个vtable中的函数呢?因为cls类中有两张vtable表,如果说它们指向同一个地址,我想知道这里面的原因?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP