﻿<?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++博客-Late Not Bad-文章分类-C/C++ 基础&amp;算法</title><link>http://www.cppblog.com/lateCpp/category/16982.html</link><description>不带感情的学习技术</description><language>zh-cn</language><lastBuildDate>Fri, 16 Sep 2011 02:38:53 GMT</lastBuildDate><pubDate>Fri, 16 Sep 2011 02:38:53 GMT</pubDate><ttl>60</ttl><item><title>_cdecl与_stdcall的区别</title><link>http://www.cppblog.com/lateCpp/articles/153668.html</link><dc:creator>lateCpp</dc:creator><author>lateCpp</author><pubDate>Wed, 17 Aug 2011 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/lateCpp/articles/153668.html</guid><wfw:comment>http://www.cppblog.com/lateCpp/comments/153668.html</wfw:comment><comments>http://www.cppblog.com/lateCpp/articles/153668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lateCpp/comments/commentRss/153668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lateCpp/services/trackbacks/153668.html</trackback:ping><description><![CDATA[简单记下。以后再补充：<br /><h1>_cdecl</h1><ol><li>参数由右到左顺序入栈。</li><li>清理栈(stack)的工作由Caller来完成。(即调用者)</li><li>可变参数的函数的完成，必须使用_cdecl。</li><li>由于caller要包含清理栈(stack)的代码，所以产生的可执行文件*.exe会比较大。</li></ol><h1>_stdcall</h1><ol><li>约定用于调用Win32　API函数。</li><li>参数由右到左入栈。</li><li>清理栈的工作由Callee来完成。（即被调用者）</li><li>参数个数固定。</li><li>由于函数本身知道传进来的参数的个数，因此可以返回前调用一条ret n指令直接清理传递参数的堆栈（stack）。<br /></li></ol><br /> <div style="position: absolute; display: none; z-index: 9999;" id="livemargins_control"><img src="chrome://livemargins/skin/monitor-background-horizontal.png" style="position: absolute;left:-77px;top:-5px" width="77" height="5"  alt="" />	<img src="chrome://livemargins/skin/monitor-background-vertical.png" style="position: absolute;left:0;top:-5px;"  alt="" />	<img id="monitor-play-button" src="chrome://livemargins/skin/monitor-play-button.png" onmouseover="this.style.opacity=1" onmouseout="this.style.opacity=0.5" style="position: absolute;left:1px;top:0;opacity:0.5;cursor:pointer"></div><img src ="http://www.cppblog.com/lateCpp/aggbug/153668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lateCpp/" target="_blank">lateCpp</a> 2011-08-17 15:16 <a href="http://www.cppblog.com/lateCpp/articles/153668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由虚函数展开的一些小实验</title><link>http://www.cppblog.com/lateCpp/articles/147304.html</link><dc:creator>lateCpp</dc:creator><author>lateCpp</author><pubDate>Thu, 26 May 2011 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/lateCpp/articles/147304.html</guid><wfw:comment>http://www.cppblog.com/lateCpp/comments/147304.html</wfw:comment><comments>http://www.cppblog.com/lateCpp/articles/147304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lateCpp/comments/commentRss/147304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lateCpp/services/trackbacks/147304.html</trackback:ping><description><![CDATA[<pre>&nbsp;</pre><pre>假设有以下三个类，是继承关系：</pre><pre><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A()<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_10_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_10_191_Open_Text.style.display='none'; Codehighlighter1_10_191_Closed_Image.style.display='inline'; Codehighlighter1_10_191_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_10_191_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_10_191_Closed_Text.style.display='none'; Codehighlighter1_10_191_Open_Image.style.display='inline'; Codehighlighter1_10_191_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_10_191_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_10_191_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试类的大小</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;A()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试构造函数的调用顺序及default<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">constructor的必要性</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img id="Codehighlighter1_102_130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_130_Open_Text.style.display='none'; Codehighlighter1_102_130_Closed_Image.style.display='inline'; Codehighlighter1_102_130_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_102_130_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_102_130_Closed_Text.style.display='none'; Codehighlighter1_102_130_Open_Image.style.display='inline'; Codehighlighter1_102_130_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_102_130_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_102_130_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">A&nbsp;Constructor!</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;f()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试虚函数的特性，此处并不是虚函数。注意！</span><span style="color: #008000"><br /></span><span style="color: #008080">13</span><span style="color: #008000"><img id="Codehighlighter1_168_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_188_Open_Text.style.display='none'; Codehighlighter1_168_188_Closed_Image.style.display='inline'; Codehighlighter1_168_188_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_168_188_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_168_188_Closed_Text.style.display='none'; Codehighlighter1_168_188_Open_Image.style.display='inline'; Codehighlighter1_168_188_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_168_188_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_168_188_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">f&nbsp;of&nbsp;A</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B()&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;A<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_216_399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_399_Open_Text.style.display='none'; Codehighlighter1_216_399_Closed_Image.style.display='inline'; Codehighlighter1_216_399_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_216_399_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_216_399_Closed_Text.style.display='none'; Codehighlighter1_216_399_Open_Image.style.display='inline'; Codehighlighter1_216_399_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_216_399_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_216_399_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试类的大小</span><span style="color: #008000"><br /></span><span style="color: #008080">22</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;B()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试构造函数的调用顺序及default<br /></span><span style="color: #008080">24</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">constructor的必要性</span><span style="color: #008000"><br /></span><span style="color: #008080">25</span><span style="color: #008000"><img id="Codehighlighter1_308_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_336_Open_Text.style.display='none'; Codehighlighter1_308_336_Closed_Image.style.display='inline'; Codehighlighter1_308_336_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_308_336_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_308_336_Closed_Text.style.display='none'; Codehighlighter1_308_336_Open_Image.style.display='inline'; Codehighlighter1_308_336_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_308_336_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_308_336_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">B&nbsp;Constructor!</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;f()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试虚函数的特性,这里是虚函数</span><span style="color: #008000"><br /></span><span style="color: #008080">30</span><span style="color: #008000"><img id="Codehighlighter1_376_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_376_396_Open_Text.style.display='none'; Codehighlighter1_376_396_Closed_Image.style.display='inline'; Codehighlighter1_376_396_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_376_396_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_376_396_Closed_Text.style.display='none'; Codehighlighter1_376_396_Open_Image.style.display='inline'; Codehighlighter1_376_396_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_376_396_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_376_396_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">f&nbsp;of&nbsp;B</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C()<br /></span><span style="color: #008080">36</span><span style="color: #000000"><img id="Codehighlighter1_413_589_Open_Image" onclick="this.style.display='none'; Codehighlighter1_413_589_Open_Text.style.display='none'; Codehighlighter1_413_589_Closed_Image.style.display='inline'; Codehighlighter1_413_589_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_413_589_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_413_589_Closed_Text.style.display='none'; Codehighlighter1_413_589_Open_Image.style.display='inline'; Codehighlighter1_413_589_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_413_589_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_413_589_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试类的大小</span><span style="color: #008000"><br /></span><span style="color: #008080">39</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;C()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试构造函数的调用顺序及default<br /></span><span style="color: #008080">41</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">constructor的必要性</span><span style="color: #008000"><br /></span><span style="color: #008080">42</span><span style="color: #008000"><img id="Codehighlighter1_505_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_505_533_Open_Text.style.display='none'; Codehighlighter1_505_533_Closed_Image.style.display='inline'; Codehighlighter1_505_533_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_505_533_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_505_533_Closed_Text.style.display='none'; Codehighlighter1_505_533_Open_Image.style.display='inline'; Codehighlighter1_505_533_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_505_533_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_505_533_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">C&nbsp;Constructor!</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">46</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;f()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于测试虚函数的特性</span><span style="color: #008000"><br /></span><span style="color: #008080">47</span><span style="color: #008000"><img id="Codehighlighter1_566_586_Open_Image" onclick="this.style.display='none'; Codehighlighter1_566_586_Open_Text.style.display='none'; Codehighlighter1_566_586_Closed_Image.style.display='inline'; Codehighlighter1_566_586_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_566_586_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_566_586_Closed_Text.style.display='none'; Codehighlighter1_566_586_Open_Image.style.display='inline'; Codehighlighter1_566_586_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_566_586_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_566_586_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">f&nbsp;of&nbsp;C</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">49</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">51</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br />几点结论：<br />&nbsp;１.构造函数调用：基类必需有无参的默认构造函数。否则派生类的构造函数无法能过编译。<br />&nbsp;　 提示：no appropriate default consturctor.</pre><pre>&nbsp;２.当new一个派生类时，如C，会依次调用所有父类的默认拷贝构造函数。<br />&nbsp;&nbsp;测试代码：<br />&nbsp;&nbsp;　<br />&nbsp;&nbsp;　　A* a = new c;<br />&nbsp;&nbsp;输出结果为：依次调用三个构造函数。</pre><pre>&nbsp;３.用基类指针指向派生类时，基类指针所指向对象的大小，变化为基类的大小。即由指针类型来决定的。<br />&nbsp;&nbsp;测试代码1：<br />&nbsp;&nbsp;&nbsp;C objectC;<br />&nbsp;&nbsp;&nbsp;A* pA;<br />&nbsp;&nbsp;&nbsp;B* pB;<br />&nbsp;&nbsp;&nbsp;C* pC;<br />&nbsp;&nbsp;&nbsp;pA = &amp;objectC;<br />&nbsp;&nbsp;&nbsp;pB = &amp;objectC;<br />&nbsp;&nbsp;&nbsp;pC = &amp;objectC;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pA)"&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pB)"&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pC)"&lt;&lt;endl;</pre><pre>&nbsp;&nbsp;&nbsp;这时输出的结果为：<br />&nbsp;&nbsp;&nbsp;４&nbsp;&nbsp;//一个int成员，大小为４字节<br />&nbsp;&nbsp;&nbsp;１２&nbsp;//二个int,另外加上一个虚函数表指针，大小为１２字节<br />&nbsp;&nbsp;&nbsp;１６&nbsp;//三个int,另外加上一个虚函数表指针，大小为１６字节</pre><pre>&nbsp;&nbsp;测试代码2:<br />&nbsp;&nbsp;&nbsp;A* pA = new C;<br />&nbsp;&nbsp;&nbsp;B* pB = new C;<br />&nbsp;&nbsp;&nbsp;C* pB = new C;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pA)"&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pB)"&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;"sizeof(*pC)"&lt;&lt;endl;</pre><pre>&nbsp;&nbsp;&nbsp;输出结果同上。</pre><pre>&nbsp;４.将基类指针指向派生类对象的操作，是安全的，也是常见的，如用CShape指针指向CRect,CCircle,COval,CTriangle对象。</pre><pre>&nbsp;５.将派生类指针转化为基类指针,如：<br />&nbsp;&nbsp;&nbsp;pC = new C;<br />&nbsp;&nbsp;&nbsp;A* pA = pC;<br />&nbsp;&nbsp;&nbsp;B* pB = pC;<br />&nbsp;&nbsp;&nbsp;或者：<br />&nbsp;&nbsp;&nbsp;A* pA = new C;<br />&nbsp;&nbsp;&nbsp;B* pB = new C;<br />&nbsp;&nbsp;&nbsp;同样是安全的，也是常见的。<br />&nbsp;&nbsp;但是，在本文的三个类中，由于类A并没有虚函数，所以情况有一些特殊:<br />&nbsp;&nbsp;&nbsp;１.pA-&gt;f();&nbsp;//输出结果为：f of A.<br />&nbsp;&nbsp;&nbsp;这仅仅是因为A类中恰好有同名函数f,若将该函数改名为fa(),<br />&nbsp;&nbsp;&nbsp;则编译会出现错误：<br />&nbsp;&nbsp;&nbsp;&nbsp;f() is not a member function of classs A...<br />&nbsp;&nbsp;&nbsp;这说明，转换后，由于本身类A无虚函数，所以编译器并没有为其构造虚函数表，也没有为其加上虚函数表指针。所以<br />&nbsp;&nbsp;&nbsp;不能寻找到函数f。即，该类没有多态能力。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;２.pB-&gt;f(); //输出结果为：f of C</pre><pre>&nbsp;&nbsp;&nbsp;因为B本身也是拥有虚函数的类，所以，编译器也为其构造了虚函数表，并在类中加上虚函数表指针变量。而虚函数表中<br />&nbsp;&nbsp;&nbsp;的内容，同类C中的虚函数表是一致的。所以，可以正确找到要调用的函数。</pre><pre>&nbsp;&nbsp;需要注意的是，因为第三条的缘故，此时若<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;sizeof(*pA);&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&lt;&lt;sizeof(*pB);&nbsp;<br />&nbsp;&nbsp;得到的结果依然是4,12。<br />&nbsp;&nbsp;这从另一个角度说明了，类的函数在内存中有单独的位置，与C语言中的函数没有差别。&#8212;&#8212;并不占用类的内存空间，也不受类<br />&nbsp;&nbsp;的影响。</pre><pre>&nbsp;６.将派生类对象转换为基类对象，则会发生一些潜在的危险。这里只从虚函数的调用来说明：</pre><pre>&nbsp;&nbsp;　&nbsp;测试代码：</pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;C testC;<br />&nbsp;&nbsp;&nbsp;&nbsp;((A*)(&amp;testC))-&gt;f();&nbsp;//输出结果为：f of A<br />&nbsp;&nbsp;&nbsp;&nbsp;((B*)(&amp;testC))-&gt;f();&nbsp;//输出结果为：f of C<br />&nbsp;&nbsp;&nbsp;&nbsp;((B)(testC)).f();&nbsp;&nbsp;//输出结果为：f of B</pre><pre>&nbsp;&nbsp;&nbsp;１.第一行的结果，同上一条的分析是一致的：将派生类的指针转换成了基类指针。由于A类并没有虚函数，因此没有虚函数表<br />&nbsp;&nbsp;&nbsp;和虚函数表指针，所以只能调用自己所拥有的、&#8220;名为f&#8221;的、函数。<br />&nbsp;&nbsp;&nbsp;２.第二行的结果，同上一条的分析是一致的：将派生类的指针转成了基类指针。但B类有虚函数，因此有虚函数表和虚函数表<br />&nbsp;&nbsp;&nbsp;指针，所以可以正确调用到对象testC,即类C中的f()函数。<br />&nbsp;&nbsp;&nbsp;３.第三行的结果，是因为将一个C类的testC对象转换成一个B类的对象，产生了称之为<strong>object<br />&nbsp;&nbsp;&nbsp;slicing</strong>&nbsp;的操作。<br />&nbsp;&nbsp;&nbsp;这基于一个通常来说正确的结论：<u>一个派生类的内存空间要比基类的内存空间要大</u>。<br />&nbsp;&nbsp;&nbsp;（因为派生类通常会拥有基类没有的数据。如在这里，类C显然要比类A大。一个１６,一个４。）<br />&nbsp;&nbsp;&nbsp;因此强制转换为将testC&#8220;割&#8221;掉一部分，然后编译器会自动调用的类B的<strong>拷贝构造函数</strong>，<br />&nbsp;&nbsp;&nbsp;来给testC此时的各项赋值。在这个过程中，虚函数表也被换成了类B的虚函数表。<br />&nbsp;&nbsp;&nbsp;所以，此时再调用f()，显然要调用B的f()函数。<br />&nbsp;&nbsp;&nbsp;４.对比第二行和第三行的结果，非常有意思：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将派生类<strong>指针</strong>转换为基类<strong>指针<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将派生类<strong>对象</strong>转换为基类<strong>对象</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;会导致不同的虚函数调用结果。<br />&nbsp;&nbsp;&nbsp;</pre>
<p><font color="#000000" face="Verdana"></font>&nbsp;</p><img src ="http://www.cppblog.com/lateCpp/aggbug/147304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lateCpp/" target="_blank">lateCpp</a> 2011-05-26 22:52 <a href="http://www.cppblog.com/lateCpp/articles/147304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>