﻿<?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++博客-天下-随笔分类-C++必杀技法</title><link>http://www.cppblog.com/aaxron/category/20393.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Mon, 24 Aug 2015 06:18:12 GMT</lastBuildDate><pubDate>Mon, 24 Aug 2015 06:18:12 GMT</pubDate><ttl>60</ttl><item><title>[原创]一个C++异常的代替方案</title><link>http://www.cppblog.com/aaxron/archive/2015/08/21/211640.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 21 Aug 2015 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/08/21/211640.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/211640.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/08/21/211640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/211640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/211640.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"stdafx.h"<br /><br />template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;E<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;errcode;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;E(){}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;E(<span style="color: #0000FF; ">const</span>&nbsp;T&amp;&nbsp;val)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;T()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;T*()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&amp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;E&lt;T&gt;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;T&amp;&nbsp;_val)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fail()&nbsp;<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;errcode;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />};<br /><br /><br />E&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;GetResult(<span style="color: #0000FF; ">bool</span>&nbsp;fail)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.val&nbsp;=&nbsp;0x1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.errcode&nbsp;=&nbsp;fail;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;obj;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;a.val&nbsp;=&nbsp;5;<br />&nbsp;&nbsp;&nbsp;&nbsp;a.errcode&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b&nbsp;=&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;c&nbsp;=&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;*c&nbsp;=&nbsp;7;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;d&nbsp;=&nbsp;a;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;e&nbsp;=&nbsp;a&nbsp;=&nbsp;8;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;E&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;x&nbsp;=&nbsp;GetResult(<span style="color: #0000FF; ">true</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(x.fail())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;\r\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("succeed&nbsp;\r\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(a.fail())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;\r\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/aaxron/aggbug/211640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-08-21 15:34 <a href="http://www.cppblog.com/aaxron/archive/2015/08/21/211640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言实现有限状态机</title><link>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 04 Mar 2013 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198217.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198217.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">C语言实现有限状态机<br /><br />有限状态机(finite&nbsp;state&nbsp;machine)是一个数学概念，如果把它运用于程序中，可以发挥很大的作用。它是一种协议，用于有限数量的子程序(&#8221;状态&#8221;)的发展变化。每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入)。<br /><br />有限状态机(FSM)可以用作程序的控制结构。FSM对于那些基于输入的在几个不同的可选动作中进行循环的程序尤其合适。投币售货机就是FSM的一个好例子。另外一个你可以想到的复杂的例子就是你正在用的东西，想到了吗？没错，就是操作系统。在投币售货机的例子中，输入是硬币，输出是待售商品，售货机有&#8221;&nbsp;接受硬币&#8221;，&#8221;选择商品&#8221;，&#8221;发送商品&#8221;和&#8221;找零钱&#8221;等几种状态。<br /><br />它的基本思路是用一张表保存所有可能的状态，并列出进入每个状态时可能执行的所有动作，其中最后一个动作就是计算(通常在当前状态和下一次输入字符的基础上，另外再经过一次表查询)下一个应该进入的状态。你从一个&#8221;初始状态&#8221;&nbsp;开始。在这一过程中，翻译表可能告诉你进入了一个错误状态，直到到达结束状态。<br /><br />在C语言中，有好几种方法可以用来表达FSM，但它们绝大多数都是基于函数指针数组。一个函数指针数组可以像下面这样声明：<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[MAX_STATES])&nbsp;();<br /><br />如果知道了函数名，就可以像下面这样对数组进行初始化。<br /><br /></span><span style="color: #0000FF; ">extern</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a(),b(),c(),d();<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[])&nbsp;()</span><span style="color: #000000; ">=</span><span style="color: #000000; ">{a,b,c,c};<br /><br />可以通过数组中的指针来调用函数：<br />(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[i])&nbsp;();<br /><br />所有函数必须接受同样的参数，并返回同种类型的返回值(除非你把数组元素做成一个联合)。函数指针是很有趣的。注意，我们可以去掉指针形式，把上面的调用写成：<br /><br />state[i]&nbsp;();<br /><br />甚至<br />(</span><span style="color: #000000; ">***</span><span style="color: #000000; ">state[i])&nbsp;();<br /><br />这是一个在ANSI&nbsp;C中流行的不良方法：调用函数和通过指针调用函数(或任意层次的指针间接引用)可以使用同一种语法。<br /><br />如果你想干得漂亮一点，可以让状态函数返回一个指向通用后续函数的指针，并把它转换为适当的类型。这样，就不需要全局变量了。如果你不想搞得太花哨，可以使用一个switch语句作为一种简朴的状态机，方法是赋值给控制变量并把switch语句放在循环内部。关于FSM还有最后一点需要说明：如果你的状态函数看上去需要多个不同的参数，可以考虑使用一个参数计数器和一个字符串指针数组，就像main函数的参数一样。我们熟悉的int&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[]机制是非常普遍的，可以成功地应用在你所定义的函数中</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/198217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-04 18:00 <a href="http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  pimpl 技法</title><link>http://www.cppblog.com/aaxron/archive/2011/11/05/159685.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 05 Nov 2011 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/05/159685.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159685.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/05/159685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159685.html</trackback:ping><description><![CDATA[<font class="Apple-style-span" face="Helvetica, Tahoma, Arial, sans-serif"><span class="Apple-style-span" style="line-height: 25px; ">
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//
<div style="display: inline-block; ">
<div><a href="file:///C:/Program%20Files/Youdao/DeskDict2/resultui/queryresult.html"><strong style="color: red; ">pimpl idiom</strong></a><font class="dot"><span style="color: red; ">..</span></font><span class="brief">指向实现的指针</span></div>
</div>
<br />
//</span><span style="color: #008000; ">pimpl&nbsp;这种做法还保障了二进制兼容性，让动态库的升级变得更容易。<br />
//隐藏了实现的细节.<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">C++代码&nbsp;&nbsp;<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;A.h&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;AImpl;&nbsp;&nbsp;<br />
<br />
</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A&nbsp;{&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;A();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func();&nbsp;&nbsp;<br />
<br />
</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;A(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;A</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;A</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;AImpl</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;impl_;&nbsp;&nbsp;<br />
}；&nbsp;&nbsp;<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;A.cpp&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;AImpl&nbsp;{&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func();&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">int&nbsp;</span><span style="color: red; ">
</span><span style="color: #000000; ">myFunc(int&nbsp;myParam);&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int &nbsp;_myVariable;&nbsp;&nbsp;<br />
};&nbsp;&nbsp;<br />
<br />
A::A()&nbsp;&nbsp;<br />
:&nbsp;impl_(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AImpl)&nbsp;&nbsp;<br />
{&nbsp;&nbsp;<br />
}&nbsp;&nbsp;<br />
<br />
A::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A()&nbsp;&nbsp;<br />
{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;impl_;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;A::func()&nbsp;&nbsp;<br />
{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;impl_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">func();&nbsp;&nbsp;<br />
} &nbsp;<br />
</span></div>
</span></font>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><font class="Apple-style-span" color="#008000"><br />
</font></div>
<br />&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;A.h&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">pimplidiom&nbsp;指向实现的指针<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">pimpl&nbsp;这种做法还保障了二进制兼容性，让动态库的升级变得更容易。<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">隐藏了实现的细节.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#pragma&nbsp;once<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;A();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func();&nbsp;&nbsp;<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;A(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;A</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;A</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;AImpl;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;声明，不是定义&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;AImpl</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;impl_;<br />};&nbsp;<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;A.cpp&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;在这里定义，完全不暴露&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A::AImpl&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;myFunc(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;myParam);&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_myVariable;&nbsp;&nbsp;<br />};&nbsp;&nbsp;<br /><br />A::A()&nbsp;&nbsp;<br />:&nbsp;impl_(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AImpl)&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br /><br />A::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A()&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;impl_;&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;A::func()&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;impl_</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">func();&nbsp;&nbsp;<br />} &nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/159685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-05 17:40 <a href="http://www.cppblog.com/aaxron/archive/2011/11/05/159685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ RAII</title><link>http://www.cppblog.com/aaxron/archive/2011/03/22/142475.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 22 Mar 2011 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/03/22/142475.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/142475.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/03/22/142475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/142475.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/142475.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;RAII<br><br>&nbsp;&nbsp;&nbsp;&nbsp;RAII是resource&nbsp;acquisition&nbsp;</span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000">&nbsp;initialization的缩写，意为&#8220;资源获取即初始化&#8221;。它是C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">之父Bjarne&nbsp;Stroustrup提出的设计理念，其核心是把资源和对象的生命周期绑定，对象创建获取资源，对象销毁释放资源。在RAII的指导下，C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">把底层的资源管理问题提升到了对象生命周期管理的更高层次。<br>&nbsp;&nbsp;&nbsp;&nbsp;说起来，RAII的含义倒也不算复杂。用白话说就是：在类的构造函数中分配资源，在析构函数中释放资源。这样，当一个对象创建的时候，构造函数会自动地被调用；而当这个对象被释放的时候，析构函数也会被自动调用。于是乎，一个对象的生命期结束后将会不再占用资源，资源的使用是安全可靠的。<br>C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;RAII体现出了简洁、安全、实时的特点：<br><br></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.概念简洁性：让资源（包括内存和非内存资源）和对象的生命周期绑定，资源类的设计者只需用在类定义内部处理资源问题，提高了程序的可维护性<br></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.类型安全性：通过资源代理对象包装资源（指针变量），并利用运算符重载提供指针运算方便使用，但对外暴露类型安全的接口<br></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.异常安全性：栈语义保证对象析构函数的调用，提高了程序的健壮性<br></span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">.释放实时性：和GC相比，RAII达到了和手动释放资源一样的实时性，因此可以承担底层开发的重任<br><br>也许你还在惊讶RAII如此简单的时候，关于RAII的主要内容已经介绍完了。简单不意味着简陋，在我看来RAII虽然不像GC一样，是一套具体的机制，但它蕴含的对象与资源关系的哲学深度的理解却使得我对Bjarne&nbsp;Stroustrup肃然起敬！<br><br>最后，不得不提醒RAII的理念固然简单，不过在具体实现的时候仍有需要小心的地方。比如对于STL的auto_ptr，可以视为资源的代理对象，auto_ptr对象间的赋值是一个需要特别注意的地方。简单说来资源代理对象间赋值的语义不满足&#8220;赋值相等&#8221;，其语义是资源管理权的转移。<br><br>什么是&#8220;赋值相等&#8221;呢？比如：<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这句话执行后&nbsp;a&nbsp;==&nbsp;b&nbsp;但对于资源代理对象，这是不满足的，比如：</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;a(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);&nbsp;&nbsp;auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;b(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">));&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这句话执行后a&nbsp;!=&nbsp;b，赋值的语义是b把资源的管理权交给了a&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>auto_ptr是这样一种指针：它是&#8220;它所指向的对象&#8221;的拥有者。这种拥有具有唯一性，即一个对象只能有一个拥有者，严禁一物二主。当auto_ptr指针被摧毁时，它所指向的对象也将被隐式销毁，即使程序中有异常发生，auto_ptr所指向的对象也将被销毁。<br><br><br>关于auto_ptr的几种注意事项：<br></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">、auto_ptr不能共享所有权。<br></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">、auto_ptr不能指向数组<br></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">、auto_ptr不能作为容器的成员。<br></span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">、不能通过赋值操作来初始化auto_ptr<br>std::auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;p(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">42</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">OK</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">std::auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">42</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ERROR</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">这是因为auto_ptr&nbsp;的构造函数被定义为了explicit<br></span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">、不要把auto_ptr放入容器<br><br>下面便是在C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">中实现RAII的典型代码：<br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;file<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;file(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;name)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fileHandle</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fopen(name.cstr());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">file()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(m_fileHandle);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;handle&nbsp;m_fileHandle;<br>}<br><br>很典型的&#8220;在构造函数里获取，在析构函数里释放&#8221;。如果我写下代码：&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;fun1()&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;myfile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">操作文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">此处销毁对象，调用析构函数，释放资源</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">当函数结束时，局部对象myfile的生命周期也结束了，析构函数便会被调用，资源会得到释放。而且，如果函数中的代码抛出异常，那么析构函数也会被调用，资源同样会得到释放。所以，在RAII下，不仅仅资源安全，也是异常安全的。<br><br>但是，在如下的代码中，资源不是安全的，尽管我们实现了RAII：<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;fun2()&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;pfile</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;file(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">操作文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}<br>因为我们在堆上创建了一个对象（通过new），但是却没有释放它。我们必须运用delete操作符显式地加以释放：<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;fun3()&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;pfile</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;file(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">操作文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pfile;<br>}<br>否则，非但对象中的资源得不到释放，连对象本身的内存也得不到回收。（将来，C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">的标准中将会引入GC（垃圾收集），但正如下面分析的那样，GC依然无法确保资源的安全）。<br>现在，在fun3()，资源是安全的，但却不是异常安全的。因为一旦函数中抛出异常，那么delete&nbsp;pfile;这句代码将没有机会被执行。<br><br>C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">领域的诸位大牛们告诫我们：如果想要在没有GC的情况下确保资源安全和异常安全，那么请使用智能指针：<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;fun4()&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">file</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;spfile(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;file(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">操作文件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">此处，spfile结束生命周期的时候，会释放（delete）对象</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">那么，智能指针又是怎么做到的呢？下面的代码告诉你其中的把戏（关于智能指针的更进一步的内容，请参考std::auto_ptr，boost或shared_ptr的智能指针）。<br>也就是说，智能指针通过RAII来确保内存资源的安全，也间接地使得对象上的RAII得到实施。不过，这里的RAII并不是十分严格：对象（所占的内存也是资源）的创建（资源获取）是在构造函数之外进行的。广义上，我们也把它划归RAII范畴。<br>但是，Matthew&nbsp;Wilson在《Imperfect&nbsp;C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">》一书中，将其独立出来，称其为RRID（Resource&nbsp;Release&nbsp;Is&nbsp;Destruction）。<br>RRID的实施需要在类的开发者和使用者之间建立契约，采用相同的方法获取和释放资源。比如，如果在shared_ptr构造时使用malloc()，便会出现问题，因为shared_ptr是通过delete释放对象的。<br></span></div>
 <img src ="http://www.cppblog.com/aaxron/aggbug/142475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-03-22 14:25 <a href="http://www.cppblog.com/aaxron/archive/2011/03/22/142475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++语言的动态联编技术剖析</title><link>http://www.cppblog.com/aaxron/archive/2010/10/27/131429.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 27 Oct 2010 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2010/10/27/131429.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/131429.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2010/10/27/131429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/131429.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/131429.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana;">联编的概念</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp;&nbsp;&nbsp; 在C++中,联编(binding)就是使一个计算机程序的不同部分彼此关联的过程.</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">在这个过程中对将每个函数调用分配内存地址,并且对外部访问也分配正确的内存地址,根据进行联编所处阶段的不同,可以分为两种不同的联编方法:静态联编和动态联编(滞后联编).</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">在编译阶段决定执行哪个同名的被调用函数,称为静态联编.</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">静态联编在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型.</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">反之在编码阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能根据地要处理的对象类型来决定执行哪个类的成员函数,这称为动态联编.</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">动态联编对成员函数的选择不是基于指针或引用,而是基于对象类型,针对不同的对象类型将作出不同的编译结果.</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">当涉及到多态性和虚函数时就应该使用动态联.</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">动态联编必须包括以下方面：</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">成员函数必须申明为virtual</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">如果基类中申明了为虚函数，则派生类中不必再申明。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">调用方式：</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">通过对象的指针或引用调用成员函数；或通过成员函数调用 </span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">C++多态性机制</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">多态性在C++里面具体表现为:通过基类指针访问派生类的函数和方法.
</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">代码如下:</span><br style="font-family: Verdana;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Verdana;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;&nbsp;&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>#include&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typeinfo</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;A<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;fun(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;class&nbsp;&nbsp;&nbsp;A!&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;A<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;fun(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;class&nbsp;&nbsp;&nbsp;B!&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;aa,</span><span style="color: #000000;">*</span><span style="color: #000000;">p;<br>&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;bb;<br>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=&amp;</span><span style="color: #000000;">bb;<br>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;fun();<br>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=&amp;</span><span style="color: #000000;">aa;<br>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;fun();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br style="font-family: Verdana;"><br>  <img src ="http://www.cppblog.com/aaxron/aggbug/131429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2010-10-27 09:12 <a href="http://www.cppblog.com/aaxron/archive/2010/10/27/131429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>