本來只想看看書就過了,但是最近在看《設計模式》和《effective C++》這兩本書,其中將到很多關於C++中封裝,繼承和多態的思想,所以不得不做一些筆記。
關於虛函數,在多態當中,一定要將基類的析構函數設置為虛函數並將其實現,只有這樣,才能夠達到按對象構造的逆序來析構對象;否則,析構的時候,只會析構基類的那一部分,那麼派生類那一部分就無法成功析構了。
class shape
{
public:
shape(){};
virtual void draw() = 0;
virtual ~shape(){cout << "shape destruction" << endl;}
};
class rectangle : public shape
{
public:
rectangle(){};
void draw()
{
}
~rectangle(){cout << "rectangle destruction" << endl;}
};
class round : public shape
{
public:
round(){};
void draw()
{
}
~round(){cout << "round destruction" << endl;}
};
void main()
{
shape * s;
? s = new rectangle();
s->draw();
delete s;
s = new round();
s->draw();
delete s;
}
--------------------------------------------------------------------------------
§純虛函數
在虛函數的中舉了shape的例子,裡面有個draw函數,但是如果具體去實現的話,draw shape?這實現起來很模糊,如果將shape基類實例化的話,就搞不清draw什麼了(畫出亂七八糟的東西,這不是客戶需要的東西,客戶需要的是具體的圖形)。因此有必要在基類shape當中,將draw的定義(實現)除去,而將它的定義(實現)留給派生類。
?class shape
{
public:
shape(){};
virtual void draw()=0; //純虛函數
};
class rectangle : public shape
{
public:
rectangle(){};
void draw()
{
畫方形;
}
};
class round : public shape
{
public:
round(){};
void draw()
{
畫圓形;
}
};
void main()
{
shape * s;
s = new rectangle();
s->draw();
s = new round();
s->draw();
}
作者 搗亂小子