游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6500|回复: 17

对于C++对象的一些研究

[复制链接]

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-3-9 21:28:00 | 显示全部楼层 |阅读模式
我们天天在喊着面向对象,究竟我们对对象了解多少?我基于对对象进行一些更深的了解的目的,做了下面的研究。

请看下面的体系:



class A

{

public:

       virtual void test()

       {

              cout<<"ttt"<<endl;

       }

       virtual void mytens(){}

       int a;

};



class C

{

public:

       virtual void test1(){}

       int c;

};



class B : public A ,public C

{

public:

       virtual void test2()

       {

              cout<<"aaa"<<endl;

       }



       int b;

};



其中,sizeof(A),sizeof(C)是8字节,sizeof(B)是20字节。为什么会这样那?让我们先看看A和C里分别有些什么。

首先肯定会有一个int,另外多出来的4字节是什么?仔细看,class是有虚函数的,于是可以大胆猜测,那4个字节是虚函数表指针。事实上也是如此。我语文不好。就直接把这个类里的数据在内存里的分布写出了。不玩虚的了。



Vtable   4字节

Int      4 字节



在我的vs.net2003里vtable是在所有的数据之前的。不同的编译器可能会不一样。但是就我个人意见,最好还是放到所有数据之前,这样this指针的位置其实就是虚函数表的位置。可能会带来一些性能的优化。

现在再看B中数据在内存里的映象:

Class A  //对象A的数据  8字节

Class C  //对象C的数据  8字节

Int      //4字节



这么分布不难理解。对象在内存里的顺序就是定义他们的顺序,继承的时候也是从左向右排列父类。关键在于,B的虚函数表在哪里?查看A虚函数表中的数据,可以知道,B的虚函数表其实是和A共享了。也就是说,B的虚函数是直接作为项添加到A的虚函数表里,至于为什么选择A。其实还是刚才所说的,这样this指针的位置其实就是虚函数表的位置。可能会带来一些性能的优化。你可以用如下的汇编代码来调用虚函数们:



Temp是一个B对象的指针



mov eax,temp

mov edx,[eax]

push edx

call [edx]

pop edx

add edx,4

push edx

call [edx]

pop edx

add edx,4

call [edx]



那么就不难理解多态了。实现多态其实就是修改虚函数表里的项。具体情况请大家自己动手看。

下面再看指针转换。当你把一个B指针转换为A指针的时候,可以看到其数值并没有变化。这个不难理解。你看B内部数据的内存映象,第一项数据其实不就是A么?那么我们可以大胆猜测,如果转化为C指针的话,那么指针的指就会调整到C的位置上,也就是ptr+=sizeof(A)。写代码验证看看,果然。



OK。我要写的就是以上这些。可以看到,我其实语文很差,同志们还要自己多多理解。如果有什么不足或者错误之类的。可以跟我联系。老规矩,放上联系方式:



秋樱工作室:http://www.autsak.com

我的Email: sakura@china.com

MSN:  autsak@hotmail.com (本邮箱不收信)

31

主题

630

帖子

635

积分

高级会员

Rank: 4

积分
635
发表于 2005-3-9 21:48:00 | 显示全部楼层

Re:对于C++对象的一些研究

面向对象就是封装,黑匣子。

14

主题

131

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2005-3-11 17:41:00 | 显示全部楼层

Re:对于C++对象的一些研究

很欣赏这种研究问题的方式

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2005-3-11 19:47:00 | 显示全部楼层

Re:对于C++对象的一些研究


这不过是具体的实现。

说的是其中一种解决办法,而非研究面向对象编程的方法。
比起实现,对设计思想的理解才是更重要的。



11

主题

136

帖子

142

积分

注册会员

Rank: 2

积分
142
QQ
发表于 2005-3-23 22:00:00 | 显示全部楼层

Re:对于C++对象的一些研究

又是好文顶起

19

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2005-3-24 07:50:00 | 显示全部楼层

Re:对于C++对象的一些研究

楼主强哦

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-3-24 08:57:00 | 显示全部楼层

Re:对于C++对象的一些研究

看到这帖子忍不住想调查一下大家有多少是做程序开发的,这些知识很基本啊...

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-3-24 10:14:00 | 显示全部楼层

Re:对于C++对象的一些研究

如果B重载了A和C的两个虚函数,那么B的这两个虚函数地址是不是分别在继承自虚函数表A和C里?

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
发表于 2005-3-24 15:29:00 | 显示全部楼层

Re:对于C++对象的一些研究

嗯,基础

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
 楼主| 发表于 2005-3-24 16:02:00 | 显示全部楼层

Re:对于C++对象的一些研究

to 7楼:
我是初学者。呵呵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 01:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表