📄 subject_26057.htm
字号:
<p>
序号:26057 发表者:gfli 发表日期:2002-12-28 12:28:35
<br>主题:c++高手请进
<br>内容:问一个关于多重继承的问题,如果定义了一个虚基类A,只有一个纯虚函数a(),(不包括构造函数),没有数据成员.另一个虚基类B,春虚函数为b(),也没有数据成员。派生类C继承与这两个基类(公有派生),并实现了函数a(),b(),他自己也定义了一虚函数c,并实现了他。<BR> 在主函数中,定义派生类的一个对象oc,我的问题是:<BR>1;编译该项目后,对象的内存布局是什么样的?(有几个vptr)<BR>2;编译器一共产生几个虚函数表,也就是编译器会不会也产生基类的虚函数表?<BR>3:假设继承的格式是这样的class C:public A,public B{.......}<BR> 如果有如下语句:<BR> B* bp<BR> pb=(B*)(&oc)<BR> A* ap<BR> ap=(A*)(&oc)<BR> C* cp<BR> cp=&oc<BR>那么,对于这三个指针所指的地址是不是同一个地址?(所以问这个问题,是因为在上面的定义中,A和B可以看成dcom对象的接口,oc可是堪为dcom对象,如果我定义了接口A的指针,并通过上面的方法得到指针,那么我只能调用接口A函数, 我想知道这时的虚函数机制是怎么实现的,我为什么不能用接口A的指针调用其它得函数,他不是实际指向的是oc对象吗?)<BR>请高手指教。<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:PLB 回复日期:2002-12-28 14:23:04
<br>内容:不全是同一地址,但是只有一点偏差<BR>具体内存布局取决于编译器的实现<BR>在作转型的操作中,编译器会自动把地址偏移到合适的位置<BR>由于c++编译器有类型检察,所以不能通过A的指针调用其他函数
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:gfli 回复日期:2002-12-28 21:18:42
<br>内容:内存中到底有几个虚函数表,对象中到底有几vptr,典型编译器是怎么实现的。我再通过接口指针调用接口函数时 ,是不是也要经过vptr,如果是的话,那么A接口指针pa 和B接口指针pb是用的同一个vptr吗?如果事,那么 在具体调用的时候编译器怎么确定虚函数表中哪一个地址才是要调用得虚函数的,因为我觉得多重继承是虚函数在虚函数表中的位置应该是不确定的。<BR>这个问题困扰了我长时间了,请高手给个全面的回答好吗,谢谢谢谢谢谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:王大磊 回复日期:2002-12-28 22:13:33
<br>内容:看一看候捷的<深入C++对象模型>一书,你会明白一切的.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2002-12-29 01:47:45
<br>内容:更正一下是 stan lepman 的 深入C++对象模型<BR>houjie只是翻译了一下,houjie自己写的书不多,翻译的比较多<BR>搞的大家都是认为是houjie写的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:gfli 回复日期:2002-12-29 17:58:41
<br>内容:谢谢大家,我已经知道答案了,那本书我已经看了三变了,呵呵,今天才发现我要找得东西。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -