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

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(由于析構也是虛函數)
}
希望回答能幫到你,哪里不清楚再問。
- 2 回答
- 0 關注
- 128 瀏覽
添加回答
舉報