为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
凤凰求蛊 2022-12-07 23:13:21
#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;}为什么输出1210苍天啊。。。
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

这个需要仔细分析

有两个类,class A中含有纯虚函数,所以A是一个抽象类。

class B :public A,类B公有继承了类A。并且对
virtual A*copy() const
virtual void out() const
两个虚函数重新实现

搞清楚继承关系后,来分析main函数

B b;
对象在产生的时候要调用构造函数,有继承关系的话,先调用基类的构造函数,在调用派生类的构造函数,所以b中的count被初始化为1.

A*a1=&b;
有个B类型的对象b,让基类指针指向了这个对象。

a1->out();

out()是一个虚函数,在这里调用的时候会动态绑定,实际上调用的是B类中的out()函数。输出count的值1

a1=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变为2
a1不在指向b对象,二是指向刚产生的这个对象。

到这一步要搞清楚,现在其实有两个B类型的对象,一个count为1,一个count为2.

a1->out();
这里输出为2

delete a1;
调用析构函数,析构函数为虚函数。所以
~B()
{count=count-1;out();}

输出1

到这一步要注意,两个对象中,一个由delete a1释放,还有一个对象b在离开作用域的时候要被系统回收析构,所以再次~B()

输出为0


查看完整回答
反对 回复 2022-12-10
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

你好,已帮你注释好:

#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();}//==============这里有个out

virtual 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为1
A*a1=&b;//======================a1指向b
a1->out();//=====================输出1
a1=a1->copy();//=========================a1=p
a1->out();//=============由于count已经加了1,故输出2
delete a1;//===============调用析构,先*p再b,*p的count减1变成1,b的count减1为0(由于析构也是虚函数)

}

希望回答能帮到你,哪里不清楚再问。


查看完整回答
反对 回复 2022-12-10
  • 2 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信