標籤:
/*當建立一個對象時,首先調用基類的建構函式,然後調用下一個衍生類別的
建構函式,依次類推,直至到達衍生類別次數最多的派生次數最多的類的建構函式為止。
簡而言之,對象是由“底層向上”開始構造的。因為,建構函式一開始構造時,總是
要調用它的基類的建構函式,然後才開始執行其建構函式體,調用直接基類建構函式時,
如果無專門說明,就調用直接基類的預設建構函式。在對象析構時,其順序正好相反。
下面的這個程式說明這個問題*/
//-------------------------------------------------
#include <iostream>
using namespace std;
class Shape
{
public:
void Draw() {cout<<"Base::Draw()"<<endl;}
void Erase() {cout<<"Base::Erase()"<<endl;}
Shape() {Draw();} //基類建構函式,調用上面的Draw函數體
virtual ~Shape() {Erase();}//基類解構函式,調用上面的Erase函數體
};
//-------------------------------------------------
class Polygon:public Shape
{
public:
Polygon() {Draw();}
void Draw() {cout<<"Polygon::Draw()"<<endl;}
void Erase() {cout<<"Polygon Erase()"<<endl;}
~Polygon() {Erase();}
};
//--------------------------------------------------
class Rectangle:public Polygon
{
public:
Rectangle() {Draw();}
void Draw() {cout<<"Rectangle::Draw()"<<endl;}
void Erase() {cout<<"Rectangle Erase()"<<endl;}
~Rectangle() {Erase();}
};
//--------------------------------------------------
class Square:public Rectangle
{
public:
Square() {Draw();}
void Draw() {cout<<"Square::Draw()"<<endl;}
void Erase() {cout<<"Square Erase()"<<endl;}
~Square() {Erase();}
};
//--------------------------------------------------
int main()
{
Polygon c;
Rectangle s;
Square t;
cout<<"------------------------------------------"<<endl;
return 0;
}
//------------------------------------------
運行結果:
Base::Draw()
Polygon::Draw()
Base::dRAW()
Polygon::Draw()
Rectangle::Draw()
Base::dRAW()
Polygon::Draw()
Rectangle::Draw()
Square::Draw()
------------------------------------------
Square Erase()
Rectangle Erase()
Polygon Erase()
Base::Erase()
Rectangle Erase()
Polygon Erase()
Base::Erase()
Polygon Erase()
Base::Erase()
Press any key to continue
C++類的繼承中建構函式和解構函式調用順序例子