请教大神为什么是这个输出结果?该怎么修改

#include<iostream>
using namespace std;
class A 
{
public:
A():count(1){}
virtual ~A(){}
virtual A * copy () const=0;
virtual void out () const=0;
protected :
int count;
};
class B :public A
{
public:
~B()
{count=count-1;out();}
virtual A*copy() const
{B *p=new B(*this);++p->count;return p;}
virtual void out() const{cout<<count<<endl;}
};
void main()
{
B b;
A*a1=&b;
a1->out();
a1=a1->copy();
a1->out();
delete a1;

}
为什么输出
1
2
1
0
苍天啊。。。

凤凰求蛊
浏览 69回答 2
2回答

跃然一笑

这个需要仔细分析有两个类,class A中含有纯虚函数,所以A是一个抽象类。class B :public A,类B公有继承了类A。并且对virtual A*copy() constvirtual void out() const两个虚函数重新实现搞清楚继承关系后,来分析main函数B b;对象在产生的时候要调用构造函数,有继承关系的话,先调用基类的构造函数,在调用派生类的构造函数,所以b中的count被初始化为1.A*a1=&b;有个B类型的对象b,让基类指针指向了这个对象。a1->out();out()是一个虚函数,在这里调用的时候会动态绑定,实际上调用的是B类中的out()函数。输出count的值1a1=a1->copy();copy()也是一个虚函数,实际上调用的是B类中的copy()函数。我们看一下这个函数干了什么virtual A*copy() const{B *p=new B(*this);++p->count;return p;}B *p=new B(*this);它重新产生了一个对象,那么和上面解释的一样,count被初始化为1++p->count;这时count变为2a1不在指向b对象,二是指向刚产生的这个对象。到这一步要搞清楚,现在其实有两个B类型的对象,一个count为1,一个count为2.a1->out();这里输出为2delete a1;调用析构函数,析构函数为虚函数。所以~B(){count=count-1;out();}输出1到这一步要注意,两个对象中,一个由delete a1释放,还有一个对象b在离开作用域的时候要被系统回收析构,所以再次~B()输出为0

婷婷同学_

你好,已帮你注释好:#include<iostream>using namespace std;class A&nbsp;{public:A():count(1){}virtual ~A(){}virtual A * copy () const=0;virtual void out () const=0;protected :int count;};class B :public A{public:~B(){count=count-1;out();}//==============这里有个outvirtual A*copy() const{B *p=new B(*this);//============创建一个B类的对象,并且让p指向他,下面并且返回p++p->count;//=============让p指向的conut自加return p;}virtual void out() const//=============只有这里有输出{cout<<count<<endl;}};void main(){B b;//================b中count为1A*a1=&b;//======================a1指向ba1->out();//=====================输出1a1=a1->copy();//=========================a1=pa1->out();//=============由于count已经加了1,故输出2delete a1;//===============调用析构,先*p再b,*p的count减1变成1,b的count减1为0(由于析构也是虚函数)}希望回答能帮到你,哪里不清楚再问。
打开App,查看更多内容
随时随地看视频慕课网APP