📄 subject_56148.htm
字号:
<p>
序号:56148 发表者:船 发表日期:2003-10-15 16:53:28
<br>主题:虚析构函数,请教高手,谢谢!
<br>内容: #include <iostream.h><BR> class A<BR> {<BR> public:<BR> ~A() { cout<<"A::~A() Called.\n"; }<BR> };<BR> class B : public A<BR> {<BR> public:<BR> B(int i) { buf = new char[i]; }<BR> ~B()<BR> {<BR> delete [] buf;<BR> cout<<"B::~B() Called.\n";<BR> }<BR> private:<BR> char * buf;<BR> };<BR><BR><BR> class A1<BR> {<BR> public:<BR> virtual ~A1() { cout<<"A1::~A1() Called.\n"; }<BR> };<BR> class B1 : public A1<BR> {<BR> public:<BR> B1(int i) { buf = new char[i]; }<BR> ~B1()<BR> {<BR> delete [] buf;<BR> cout<<"B1::~B1() Called.\n";<BR> }<BR> private:<BR> char * buf;<BR> };<BR><BR>// void fun(A *a)<BR> // {<BR> // delete a;<BR> //}<BR> void main()<BR> {<BR> <BR> A *a = new B(14);<BR> delete a;<BR> cout<<"---------1\n"; //a<BR><BR> a= new B(15); //???<BR> delete (B * )a;<BR> cout<<"---------3\n"; //b a<BR> <BR> A1 *a1 = new B1(14);<BR> delete a1;<BR> cout<<"1---------1\n";//b1 a1<BR><BR> a1= new B1(15); //???<BR> delete (B1 * )a1;<BR> cout<<"1---------3\n"; //b1 a1<BR><BR> }<BR><BR>输出结果是:<BR>A::~A() Called.<BR>---------1<BR>B::~B() Called.<BR>A::~A() Called.<BR>---------3<BR>B1::~B1() Called.<BR>A1::~A1() Called.<BR>1---------1<BR>B1::~B1() Called.<BR>A1::~A1() Called.<BR>1---------3<BR><BR>对于???处的输出不明白,请高手帮忙!<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:xiongli 回复日期:2003-10-15 18:45:02
<br>内容:a= new B(15); //???<BR> delete (B * )a;<BR> cout<<"---------3\n"; //b a<BR><BR>完全就等于<BR>delete new B(15);阿<BR>那当然是先调用b的析构函数,然后是b基类的析构函数,也就是~a()了<BR><BR>虚构造函数解决的是这种问题<BR>你试试这个<BR>a= new B(15); //???<BR> delete a;<BR> cout<<"---------3\n"; //b a<BR>你会看到只调用了a的析构函数,b的析构函数没有得到调用,但实际上,我们是希望先调用b的析构函数,然后是a的析构函数<BR><BR>你再看看这个<BR>a1= new B1(15); //???<BR> delete a1;<BR> cout<<"---------3\n"; //b a<BR>通过虚析构函数,结果就正确了<BR>2003-10-15 18:46:21
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -