亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教大神為什么是這個輸出結果?該怎么修改

請教大神為什么是這個輸出結果?該怎么修改

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 關注
  • 128 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號