﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-随意飘荡</title><link>http://www.cppblog.com/guanghong/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 21:36:11 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 21:36:11 GMT</pubDate><ttl>60</ttl><item><title>LPVOID,static_cast 的问题</title><link>http://www.cppblog.com/guanghong/archive/2008/05/12/49629.html</link><dc:creator>Guanghong(随意飘荡)</dc:creator><author>Guanghong(随意飘荡)</author><pubDate>Mon, 12 May 2008 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/guanghong/archive/2008/05/12/49629.html</guid><wfw:comment>http://www.cppblog.com/guanghong/comments/49629.html</wfw:comment><comments>http://www.cppblog.com/guanghong/archive/2008/05/12/49629.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/guanghong/comments/commentRss/49629.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guanghong/services/trackbacks/49629.html</trackback:ping><description><![CDATA[<p>C++ Blog,这名太专业了,让人有点害怕,特别是向我这种C++的半瓶醋,真害怕玷污了C++这个词啊!<br>我从没写过Blog,向这种专业方面的就更没写过了,主要目的还是来看别人的Blog，并学习的！呵呵<br>今天第一次写，实在不知道写点什么，就还是提个问题吧。前几天讨论过一个指针强制转换的问题。测试代码如下：<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;namespace&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>class&nbsp;Base1<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;foo(){cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base1&nbsp;&nbsp;&nbsp;&nbsp;foo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;foo1(){cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base1&nbsp;&nbsp;&nbsp;foo1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>class&nbsp;Base2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;foo2(){cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base2&nbsp;&nbsp;&nbsp;&nbsp;foo2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;foo3(){cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base2&nbsp;&nbsp;&nbsp;&nbsp;foo3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>class&nbsp;Derived&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base1,&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;Derived&nbsp;a;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;(static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Base1</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">((LPVOID)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo1();</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">调用Base1.foo1<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;(static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Base1</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo1();&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">调用Base1.foo1<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;(static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Base2</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">((LPVOID)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo2();</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">调用Base1.foo<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;(static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Base2</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo2();</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">调用Base2.foo2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>return&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>前两个结果都很正确,将a强制转换为其基类的指针，调用基类的函数。<br>而对于第三个第四个，它们得到的结果却不一样。<br>第三个我是这样理解的：由于强制转换之后，转换之后的指针根据虚函数表去调用函数，而由于LPVOID的存在，(static_cast&lt;Base2*&gt;((LPVOID)&amp;a))-&gt;foo2();调用的是&nbsp;Derived虚函数表中第一个函数指针所指向的函数，也就是Base1的foo。<br>因此，对于，(static_cast&lt;Base1*&gt;((LPVOID)&amp;a))-&gt;foo1();其调用的也是&nbsp;Derived中虚函数表中的第二个函数。<br>第四个的调用是正确的。<br>因此，如果在申明&nbsp;Derived的时候，改变一下继承的顺序，class Derived : public Base2, public Base1<br>那么得到的结果将是(static_cast&lt;Base1*&gt;((LPVOID)&amp;a))-&gt;foo1();将会调用虚函数表中的第二个函数，为Base2.foo3。<br>如果得到的类型是LPVOID类型的，直接使用static_cast转换就会出错，这是我前几天碰到的一个问题，可能是我的设计有问题，不过应该也有解决的方案，我的思路是先计算Derived中基类的偏移，然后再进行转换，不过我还不知道怎么实现，不知道谁能帮我解决或者有更好的解决方案！<br>第一次写Blog，欢迎大家光临和教导！谢谢^_^</p>
<img src ="http://www.cppblog.com/guanghong/aggbug/49629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guanghong/" target="_blank">Guanghong(随意飘荡)</a> 2008-05-12 13:17 <a href="http://www.cppblog.com/guanghong/archive/2008/05/12/49629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>