标题:[讨论]关于虚拟的讨论,大家都来聊聊自己的见解。
只看楼主
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
 问题点数:0 回复次数:7 
[讨论]关于虚拟的讨论,大家都来聊聊自己的见解。
#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
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
得分:0 

对于VTBL的原理的探究固然很好,但是从实用的角度出发,是不是这段代码没有意义呢?

这段代码能够给我们实际的开发带来什么好处吗?能带来一种新的设计模式吗?我认为多态的好处是这样
pa->draw()
pa->eat()
它的集成类能够通过多态实现不同的操作

而不是无意义的进行指针之间的无意义的强制转化

当然斑竹大人你纯粹探讨这么个编译原理的东西,也未尝不可

聊且一辨


http://kongfuziandlife. http://codeanddesign.
2007-05-29 22:27
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 

mark下!

Fight  to win  or  die...
2007-05-29 23:08
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
轮廓
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-4-20
得分:0 
http://kongfuziandlife.blogspot.com

里面的东西有些确有见解,呵呵,谢谢zinking分享
2007-05-30 16:14
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
得分:0 


多继承已经被废弃了,可以这么说!现在新出来的语言如JAVA,C#都不支持多继承,

当然了解原理是很好的,想我这样只注重实际的有的时候真的会被原理所困

http://kongfuziandlife. http://codeanddesign.
2007-05-30 19:43
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.118374 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved