subject_25473.htm

来自「一些关于vc的问答」· HTM 代码 · 共 42 行

HTM
42
字号
<p>
序号:25473 发表者:雪候鸟 发表日期:2002-12-23 00:43:20
<br>主题:虚函数!!!
<br>内容:请问虚函数实现的机制,也就是在编译时怎样运行的<BR>(基类的指针是怎样调用不同子类对象的成员函数的)<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>
回复者:子龙 回复日期:2002-12-23 11:32:33
<br>内容:类在内存中有个VTable,虚表用来记载成员函数的入口<BR>所以不同对象只要能够找到自己类的VTable就可以了<BR><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-23 18:47:01
<br>内容:假如你从基类派生了一个类:<BR>当在派生类中修改了虚拟函数时,实际执行的时候执行的是你已经修改了的虚函数。<BR>如果没有修改执行的是基类中的虚函数。<BR><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-23 22:11:00
<br>内容:不太清楚,什么书讲得比较透彻一点<BR>用基类指针指向派生类对象(指向的过程)主要是想了解这个<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>
回复者:dr0 回复日期:2002-12-23 22:24:14
<br>内容:think in c++ 有一章专门讲virtual function, 需要一丁点汇编指令的知识.<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>
<font color=red>答案被接受</font><br>回复者:IceAge 回复日期:2002-12-23 23:21:49
<br>内容:普通函数是直接调用,因为编译器知道函数的地址,而虚函数是通过间接调用,即通过 virtual table里的函数指针调用函数。这样,通过派生类的基类指针对虚函数的调用,变成了通过函数指针运行函数,可以运行派生类的函数,因为 virtual table 里放的是派生类的函数指针。
<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:32:29
<br>内容:你可以这样理解,在定义派生类的对象时,构造函数会自动把虚函数表的首地址放在对象的开头(具体位置视编译器有差别),而虚函数表是在编译时根据派生类的定义预先设置的,所以如果你在派生类里重新定义了几类的虚函数,那么虚寒暑表中就会放置重新定义的函数的地址,这个虚寒暑表被编译器放在程序的数据段,它的首地址编译器是知道的,所以他很容易在构造函数里添加 代码吧这个地址放在vptr里。
<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 + =
减小字号Ctrl + -
显示快捷键?