⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_45701.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:45701 发表者:罗兹维尔 发表日期:2003-07-02 23:13:05
<br>主题:虚析构的疑惑
<br>内容:#include "iostream.h"<BR><BR>class Base<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;~Base(){ cout&lt;&lt;"~Base"&lt;&lt;endl; }<BR>};<BR><BR>class Derived:public Base<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;~Derived(){ cout&lt;&lt;"~Derived"&lt;&lt;endl; }<BR>};<BR><BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Derived D;<BR>}<BR><BR>输出为<BR>~Derived<BR>~Base<BR><BR>这样与析构声明为virtual有什么区别呢?//修饰为virtual之后结果也事,但什么情况下virtual的虚函数有价值?<BR>为什么会有这样的输出
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:_DAWN_ 回复日期:2003-07-03 07:00:19
<br>内容:在定义接口时会很有价值,就是说定义纯虚的基类.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-07-03 10:00:51
<br>内容:Base *pCBase=new Derived;<BR><BR>delete pCBase; //when virtual destructor, call Derived::~Derived<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //when not virtual destructor, call Base::~Base
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:非常可乐(用VC的老头) 回复日期:2003-07-03 11:29:20
<br>内容:补充楼上的<BR>虚析构函数<BR><BR>在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。例如:<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;class B<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual ~B();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;};<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;该类中的析构函数就是一个虚析构函数。<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;下面举一个用虚析构函数的例子。<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;iostream.h&gt;<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;class A<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~A() { cout&lt;&lt;"A::~A() Called.\n"; }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;};<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;class B : public A<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;B(int i) { buf = new char[i]; }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~B()<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] buf;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"B::~B() Called.\n";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;private:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;char * buf;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;};<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;void fun(A *a)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;delete a;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;void main()<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;A *a = new B(15);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fun(a);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;执行该程序输出如下结果:<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;B::~B() Called.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;A::~A() Called.<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果类A中的析构函数不用虚函数,则输出结果如下:<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;A::~A() Called.<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当说明基类的析构函数是虚函数时,调用fun(a)函数,执行下述语句:<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;delete a;<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;由于执行delete语句时自动调用析构函数,采用动态联编,调用它基类的析构函数,所以输出上述结果。<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,故产生<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;A::~A() Called.<BR><BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;的结果。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -