📄 subject_40416.htm
字号:
<p>
序号:40416 发表者:丁伟锋 发表日期:2003-05-18 16:57:48
<br>主题:C++的类指针
<br>内容:如果C++类有虚拟函数,那么编译起会为该类创建一个vtbl,并且创建一vptr指向该vtbl。<BR>如果我创建一个类的实例A,并且获得指向该类的一个指针pA,那么这个指针pA应该是指向vptr的.按这样的说法,要调用A的虚拟函数时,使用的语法应该是。(*(*pA)).fun()有就是(*pA)->fun().<BR>为什么是pA->fun()呢?<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>回复者:Fang 回复日期:2003-05-18 18:05:49
<br>内容:vptr,vtbl对你的代码而言,都是不可见的,vptr->fun()并不存在这样的代码。所以不能(*pA)->fun().<BR>pA->fun()编译器会识别虚函数,会做正确的调用。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:张鸿彬 回复日期:2003-05-18 21:15:26
<br>内容:vtble不是你用的,是编译器用的。语法只规定了语句的含义,具体的实现每个编译器都是不同的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:哎哟 回复日期:2003-05-29 08:41:34
<br>内容:“如果C++类有虚拟函数,那么编译起会为该类创建一个vtbl,并且创建一vptr指向该vtbl。<BR>如果我创建一个类的实例A,并且获得指向该类的一个指针pA,那么这个指针pA应该是指向vptr的.”<BR>明显逻辑问题。假如你父母创造你的时候,现创造了5个手指,然后再创建一个手指向他们。<BR>然后再创建你,那么,你是不是就是一只手呢????<BR><BR>这是一个局部和整体的关系,就算要调用,也不是<BR>(**a)();<BR>而是<BR>a->vptr[0]();<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 + -