﻿<?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++博客-sin的博客-随笔分类-C/C++/STL</title><link>http://www.cppblog.com/sixinquan/category/13268.html</link><description>时间悄悄地流过，今天你做了什么</description><language>zh-cn</language><lastBuildDate>Sat, 26 Oct 2013 15:58:45 GMT</lastBuildDate><pubDate>Sat, 26 Oct 2013 15:58:45 GMT</pubDate><ttl>60</ttl><item><title>C++对象模型</title><link>http://www.cppblog.com/sixinquan/archive/2013/10/26/203929.html</link><dc:creator>sin</dc:creator><author>sin</author><pubDate>Sat, 26 Oct 2013 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/sixinquan/archive/2013/10/26/203929.html</guid><wfw:comment>http://www.cppblog.com/sixinquan/comments/203929.html</wfw:comment><comments>http://www.cppblog.com/sixinquan/archive/2013/10/26/203929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixinquan/comments/commentRss/203929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixinquan/services/trackbacks/203929.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.csdn.net/wxc1987821/article/details/5958325&#8212;&#8212;谈VC++对象模型&nbsp;&nbsp; （美）简.格雷&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程化&nbsp;&nbsp;&nbsp; 译      译者前言    一个C++程序员，想要进一步提升技术水平的话，应该多...&nbsp;&nbsp;<a href='http://www.cppblog.com/sixinquan/archive/2013/10/26/203929.html'>阅读全文</a><img src ="http://www.cppblog.com/sixinquan/aggbug/203929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixinquan/" target="_blank">sin</a> 2013-10-26 23:39 <a href="http://www.cppblog.com/sixinquan/archive/2013/10/26/203929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚析构函数问题：为什么要将基类的的析构函数设成虚的？</title><link>http://www.cppblog.com/sixinquan/archive/2013/10/19/203817.html</link><dc:creator>sin</dc:creator><author>sin</author><pubDate>Sat, 19 Oct 2013 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/sixinquan/archive/2013/10/19/203817.html</guid><wfw:comment>http://www.cppblog.com/sixinquan/comments/203817.html</wfw:comment><comments>http://www.cppblog.com/sixinquan/archive/2013/10/19/203817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixinquan/comments/commentRss/203817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixinquan/services/trackbacks/203817.html</trackback:ping><description><![CDATA[<span style="font-size: xx-small;"></span><div><span style="font-size: 9pt;"><span style="font-family: 宋体;">转自：</span></span>http://blog.csdn.net/pathuang68/article/details/4156308</div><span style="font-size: 9pt;"><span style="font-family: 宋体;"><br />某</span></span><span style="font-size: 9pt; font-family: Arial;">CSDN</span><span style="font-family: 宋体;"><span style="font-size: 9pt;">网友问：</span></span><span style="font-size: xx-small;"><span style="font-family: arial,helvetica,sans-serif;"></span></span> <div><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: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A()&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">A::~A</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;B:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;A<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">B()&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">B::~B</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;C:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;B<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">C()&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">C::~C</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />};<br /><br />&nbsp;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;A&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;A();&nbsp;<br />&nbsp;&nbsp;&nbsp;B&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;B();&nbsp;<br />&nbsp;&nbsp;&nbsp;C&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">c</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;C();&nbsp;<br />&nbsp;&nbsp;&nbsp;A&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">d</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;B();&nbsp;<br />&nbsp;&nbsp;&nbsp;A&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">e</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;C();&nbsp;<br />&nbsp;&nbsp;&nbsp;B&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">f</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;C();&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;delete&nbsp;a;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;delete&nbsp;b;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;delete&nbsp;c;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;delete&nbsp;d;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;delete&nbsp;e;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br />&nbsp;&nbsp;&nbsp;delete&nbsp;f;&nbsp;<br />&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">endl;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Pause</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />} <br /></span></div><strong><span style="font-family: Arial;"></span></strong><p><strong><span style="font-size: 9pt; font-family: Arial;"></span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">这段程序运行时有错，当时考的时候题目直接说写出运行结果，我就稀里糊涂得写下来，回来编下发现有错，请教下错在哪，最好告诉我为什么？</span></strong></p>  <p><span style="font-size: small;"><span style="font-family: 宋体;"></span></span> </p><p> </p><p><span style="font-size: xx-small;">&nbsp;</span>&nbsp;</p>   <p><span style="font-family: 宋体;"><span style="font-size: 9pt;">玄机逸士回答：</span></span></p> <p><span style="font-size: 9pt; font-family: Arial;">1. </span><span style="font-size: 9pt;"><span style="font-family: 宋体;">一般来说，如果一个类要被另外一个类继承，而且用其指针指向其子类对象时，如题目中的</span></span><span style="font-size: 9pt; font-family: Arial;">A* d = new B();(</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">假定</span></span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">是基类，</span></span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">是从</span></span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">继承而来的派生类</span></span><span style="font-size: 9pt; font-family: Arial;">)</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">，那么其</span></span><span style="font-size: 9pt; font-family: Arial;">(A</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">类</span></span><span style="font-size: 9pt; font-family: Arial;">)</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">析构函数必须是虚的，否则在</span></span><span style="font-size: 9pt; font-family: Arial;">delete d</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">时，</span></span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">类的析构函数将不会被调用，因而会产生内存泄漏和异常；</span></span><span style="font-size: 9pt; font-family: Arial;"> <br /><br /></span></p> <p><span style="font-size: 9pt; font-family: Arial;">2. </span><span style="font-size: 9pt;"><span style="font-family: 宋体;">在构造一个类的对象时，先构造其基类子对象，即调用其基类的构造函数，然后调用本类的构造函数；销毁对象时，先调用本类的析构函数，然后再调用其基类的构造函数；</span></span><span style="font-size: 9pt; font-family: Arial;"> <br /><br /></span></p> <p><span style="font-size: 9pt; font-family: Arial;">3. </span><span style="font-size: 9pt;"><span style="font-family: 宋体;">题目给出的代码是可以编译的，但会出现运行时错误。错误出现在</span></span><span style="font-size: 9pt; font-family: Arial;">delete d;</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">这一句。为讨论方便，我们不妨将</span></span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">类和</span></span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;"><span style="font-family: 宋体;">类改写如下：</span></span></p><p><span style="font-size: 9pt;"><span style="font-family: 宋体;"><br /></span></span></p><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: #0000FF; ">class</span><span style="color: #000000; ">&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; ">int</span><span style="color: #000000; ">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A()<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; ">A::~A</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></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 />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">B()<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; ">B::~B</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}; <br /></span></div><p> </p> <p><span style="font-size: 9pt; color: blue; font-family: Arial;"><br /></span><span style="font-size: 9pt; color: black; font-family: Arial;"></span><span style="font-size: 9pt; font-family: Arial;"></span></p><p><span style="font-size: 9pt; font-family: Arial;"></span><span style="font-size: 9pt; font-family: 宋体;">那么</span><span style="font-size: 9pt; font-family: Arial;">A* d = new B();</span><span style="font-size: 9pt; font-family: 宋体;">这一句的左边所产生</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt; font-family: 宋体;">的对象的内存结构如下：</span></p></div><img alt="" src="http://www.cppblog.com/images/cppblog_com/sixinquan/classB.GIF" height="212" width="243" /><br /><br /><div><p><span style="font-size: 9pt; font-family: 宋体;"><span style="font-size: xx-small;"><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: 9pt; font-family: 宋体;">而</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt; font-family: 宋体;">对象的内存结构如下：</span></span></span></span></p><p><span style="font-size: 9pt; font-family: 宋体;"><span style="font-size: xx-small;"><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.cppblog.com/images/cppblog_com/sixinquan/classA.GIF" height="64" width="135" /></span></span></span></span></p><p><span style="font-size: 9pt; font-family: 宋体;"><span style="font-size: xx-small;"><span style="font-family: arial,helvetica,sans-serif;"><br /><span style="font-size: 9pt; font-family: 宋体;"></span></span></span></span></p><div><span style="font-size: 9pt;">可见</span><span style="font-size: 9pt; font-family: Arial;">d</span><span style="font-size: 9pt;">只能找到</span><span style="font-size: 9pt; font-family: Arial;">a</span><span style="font-size: 9pt;">和</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">类的析构函数，而无法找到</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">对象的析构函数，所以当</span><span style="font-size: 9pt; font-family: Arial;">delete d;</span><span style="font-size: 9pt;">的时候，</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">对象所占用的内存就此被泄漏掉了，也从而产生了异常。</span><span style="font-size: 9pt; font-family: 宋体;"><br /><br />如果将</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt; font-family: 宋体;">类的析构函数设为虚的，那么</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt; font-family: 宋体;">类对象的内存结构将为：<br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/sixinquan/newClassA.GIF" height="165" width="174" /><br /><br /><div><span style="font-size: 9pt; font-family: Arial;"><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt; font-family: 宋体;">类对象的内存结构为：</span></span></div><img alt="" src="http://www.cppblog.com/images/cppblog_com/sixinquan/newclassB.GIF" height="212" width="243" /><br /><br /><div><p><span style="font-size: 9pt;">此时通过</span><span style="font-size: 9pt; font-family: Arial;">A* d = new B();</span><span style="font-size: 9pt;">，</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">对象的内存结构中的</span><span style="font-size: 9pt; font-family: Arial;">vfptr</span><span style="font-size: 9pt;">，即虚函数表指针，就是</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">对象的</span><span style="font-size: 9pt; font-family: Arial;">vfptr(B</span><span style="font-size: 9pt;">对象的</span><span style="font-size: 9pt; font-family: Arial;">vfptr</span><span style="font-size: 9pt;">被</span><span style="font-size: 9pt; font-family: Arial;">bitwise copy</span><span style="font-size: 9pt;">，即浅拷贝到</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">对象的</span><span style="font-size: 9pt; font-family: Arial;">vfptr</span><span style="font-size: 9pt;">。如</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">是从</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">虚继承而来的，则需要加一个</span><span style="font-size: 9pt; font-family: Arial;">offset</span><span style="font-size: 9pt; font-family: Arial;">，情况要更复杂，见<a href="http://blog.csdn.net/pathuang68/archive/2009/04/24/4105902.aspx">http://blog.csdn.net/pathuang68</a><a href="http://blog.csdn.net/pathuang68/archive/2009/04/24/4105902.aspx">/archive/2009/04/24/4105902.aspx</a>)</span><span style="font-size: 9pt;">，因此，</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">对象的</span><span style="font-size: 9pt; font-family: Arial;">vfptr</span><span style="font-size: 9pt;">所指向的是</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">对象的虚函数表，而</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">的析构函数位于书函数表</span><span style="font-size: 9pt; font-family: Arial;">0</span><span style="font-size: 9pt;">的位置，因此，这样就可以通过</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt;">类对象的指针</span><span style="font-size: 9pt; font-family: Arial;">d</span><span style="font-size: 9pt;">，找到</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">类对象的析构函数，从而在</span><span style="font-size: 9pt; font-family: Arial;">delete d;</span><span style="font-size: 9pt;">时，可以销毁</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt;">对象，而不会产生内存泄漏和异常。</span> </p> <p><span style="font-size: 9pt; font-family: Arial;"><br /></span><span style="font-size: 9pt; font-family: 宋体;">事实上，该题目只要将</span><span style="font-size: 9pt; font-family: Arial;">A</span><span style="font-size: 9pt; font-family: 宋体;">中的析构函数设成虚的，</span><span style="font-size: 9pt; font-family: Arial;">B</span><span style="font-size: 9pt; font-family: 宋体;">类中的析构函数前面的</span><span style="font-size: 9pt; font-family: Arial;">virtual</span><span style="font-size: 9pt; font-family: 宋体;">关键字不管是否存在，其析构函数也一定是虚的，</span><span style="font-size: 9pt; font-family: Arial;">C</span><span style="font-size: 9pt; font-family: 宋体;">类同此道理。因此，得到结论就是，只要能够保证继承关系中最高的基类的析构函数是虚的，那么就不会产生前面所谈及的问题。这就是为什么在想使用多态特性的时候，需要将基类的析构函数设成虚的真正原因。</span><br /></p></div></span></div><p>&nbsp;</p><p><span style="font-size: 9pt; font-family: 宋体;"><span style="font-size: xx-small;"><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: 9pt; font-family: 宋体;"></span></span></span></span></p></div><img src ="http://www.cppblog.com/sixinquan/aggbug/203817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixinquan/" target="_blank">sin</a> 2013-10-19 21:36 <a href="http://www.cppblog.com/sixinquan/archive/2013/10/19/203817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>