标题:[讨论]关于虚拟的讨论,大家都来聊聊自己的见解。
取消只看楼主
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
 问题点数:0 回复次数:2 
[讨论]关于虚拟的讨论,大家都来聊聊自己的见解。
#include "stdafx.h"
class A
{
public:
virtual void Draw()=0;
virtual void Eat()=0;
};
class B
{
public:
virtual void Eat()=0;
virtual void Draw()=0;
};
class C:public A,public B
{
public:
virtual void Draw(){printf("Draw\n");}
virtual void Eat(){printf("Eat\n");}
};
int main(int argc, char* argv[])
{
C*pc=new C;
A*pa=(A*)pc;
B*pb=(B*)pc;
pa->Draw();
pb->Eat();
pb=(B*)pa;
pb->Eat();
pa=(A*)(B*)(C*)pa;
pa->Draw();
return 0;
}
输出:
Draw
Eat
Draw
Eat
根据多继承虚拟类,派生类中有多个vtbl指针,所以将派生类指针转换成基类时,如果只是转换成第一个继承的基类,那么指针没有偏移,因为都指向类的内存快的开始处,而转换成第二个基类时,将会发生偏移.在调用虚拟函数时,似乎是根据虚拟函数在基类中的索引顺序来调用。比如是A类指针调用Draw就是调用虚表第一个函数,B类就是调用第二个函数。所以如果将一个B类指针转换成A类指针,然后调用A类的Draw函数,其实就是调用B类的Eat函数。
搜索更多相关主题的帖子: 见解 虚拟 
2007-05-29 15:15
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
to zinking:
由于最近看COM技术内幕,这才了解了一点vtbl的东西,以前都没怎么看过,所以就想了解一下vtbl的其他特质(以前只知道单继承时的vtbl的作用)。比如这个转换偏移就是今天刚刚才知道的,所以想和大家探讨一下。对于上面的那段代码:的确是没用的垃圾代码

不过只是为了验证vtbl和偏移这两个东东的测试代码。。。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-05-29 23:54
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
多继承为什么会废气啊?
组件编程时不是要继承多个接口吗?
难道每个组件只能实现一个接口,然后只能用一个组件来聚合所有接口吗?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-17 20:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-143262-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.191176 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved