(5-1)以下这道C++题要怎么看啊?为什么运行结果会是那样的?

#include<iostream>usingnamespacestd;classCA{public:CA(){cout<<"A'sconstructed.\n";}vo... #include <iostream>
using namespace std;

class CA
{
public:
CA()
{
cout<<"A's constructed.\n";
}
void fun()
{
cout<<"I am A"<<endl;
}
~CA()
{
cout<<"A's destructed"<<endl;
}
};
class CB:public CA
{
public :
CB()
{
cout<<"B's constructed "<<endl;
}
void fun()
{
cout<<"I am B"<<endl;
}
~CB()
{
cout<<"B's destructed."<<endl;
}
};

void main()
{
CA *p_a;
p_a=new CB();
p_a->fun();
delete p_a;
}
展开
 我来答
1062665477
2010-12-05 · TA获得超过553个赞
知道小有建树答主
回答量:166
采纳率:0%
帮助的人:231万
展开全部

楼主的例子中涉及了类的构造和析构顺序、类的多态(动态绑定)。

首先,构造派生类之前先要构造基类,这个我就不多说了,与一楼的大同小异。

至于类的多态调用,基类的指针可以指向派生类(因为对于派生类,他内部的基类成员部分占得是整个派生类的低地址部分,所以内部基类成员部分的入口地址其实就是派生类的地址。具体见后图),其他如一楼所言。

这里我只是想补充一点。

我姑且先自以为是的认为,楼主惊讶的是最后的delete p_a;这一句(或者说为什么编译运行后没有B's destructed这一句。当然如果你是新手,更应该深入研究这类问题。)

按照一般推理,我们用类的多态性动态构造了对象,就一定要动态的销毁对象。(即new与delete在某个范围类成对出现。)

所以,编译运行后的结果应该是:

A's constructed

B's constructed

I am A

B's destructed

A's destructed

然而为什么不对呢?delete p_a后为什么没有调用CB类的构造函数呢?

原因是这里的基类的析构函数没有申明为virtual。如果不声明为virtual,编译器就不会为你动态解析,只会静态调用该指针类型的析构函数。

总结:一般设计到类的继承和多态时,类的基类的析构函数一定注意声明为virutal,否则很可能造成内存的泄露(因为该类的派生类成员部分没有被释放,释放的只是内部基类成员部分)。但也不要所有都声明为virtual哦,有讲究的,不然会在一定程度上影响代码执行效率。详细见c++ primer和effective c++。

jdq_37
2010-12-04 · TA获得超过996个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:955万
展开全部
解释如下:
p_a=new CB();
CB继承自CA,new CB()的时候,先运行CA的构造函数,再运行CB的构造函数。
即显示:
A's constructed
B's constructed

p_a->fun();
CA*p_a说明p_a是指向的CA类型数据的指针,p_a->fun();执行CA下的成员函数fun()。
即显示:
I am A

delete p_a;
销毁p_a所指CA类型的数据,自动调用CA类的析构函数~CA()。
即显示:
A's destructed

完毕。

祝你好运!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jvutdv
2010-12-05 · TA获得超过836个赞
知道小有建树答主
回答量:829
采纳率:0%
帮助的人:774万
展开全部
这不难吧?保存一下,明天没人帮你写,那我来写呵呵.先把机会让给别人/
已经帮你写好了,程序没什么问题.但是如果你没有写错的话,我觉得你们老师在参数上,给出的条件不合理.比如int arraySize, int * maxPtr, int * minPtr,这三参这样写,传递明显是没有丝毫意义的.
因为根本就不可能返回到main函数中.还有int elementSize这个参数有必要传递吗?strlen(string)就可以得到,干吗非得传过来?可以这样说,这道题有点象改错题,而不是作业题.里面参数实在是太莫名其妙了.最后说一下吧,下面的程序已经调试通过,没什么问题.自己运行看看吧.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define max 200

int find(char string[], int elementSize, int array[],int arraySize, int *maxPtr, int *minPtr)
{
int st[max]=;
int j=0;
int k=0;
for(int i=0;i<=elementSize;i++)
{
if(isdigit(string[i]))
{
st[j]=string[i]-48;
j++;
}
else if(j>0)
{
int n=0;
for(int m=0;m<j;m++)
{
n+=int(st[m]*pow(10,j-1-m));
}
array[k]=n;
k++;
j=0;
}
}
arraySize=k;
maxPtr=minPtr=&array[0];
for(i=1;i<arraySize;i++)
{
if(*maxPtr<array[i])maxPtr=&array[i];
if(*minPtr>array[i])minPtr=&array[i];
}
printf("\n合并后的有效数字为:\n");
for(int v=0;v<k;v++)
printf("%3d",array[v]);
printf("\n");
printf("\n整数中最大值是:%d\n",*maxPtr);
printf("\n整数中最小值是:%d\n",*minPtr);
return k;
}
void main()
{
char str[max]="10iu4p0i6";
int array[max]=;
int arraySize,*maxPtr,*minPtr;
find(str,strlen(str),array,arraySize,maxPtr,minPtr);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式