(5-1)以下这道C++题要怎么看啊?为什么运行结果会是那样的?
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;
} 展开
楼主的例子中涉及了类的构造和析构顺序、类的多态(动态绑定)。
首先,构造派生类之前先要构造基类,这个我就不多说了,与一楼的大同小异。
至于类的多态调用,基类的指针可以指向派生类(因为对于派生类,他内部的基类成员部分占得是整个派生类的低地址部分,所以内部基类成员部分的入口地址其实就是派生类的地址。具体见后图),其他如一楼所言。
这里我只是想补充一点。
我姑且先自以为是的认为,楼主惊讶的是最后的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++。
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
完毕。
祝你好运!
已经帮你写好了,程序没什么问题.但是如果你没有写错的话,我觉得你们老师在参数上,给出的条件不合理.比如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);
}