C++虛函數和純虛函數(2)


轉載自:http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/04/2275520.html

本來只想看看書就過了,但是最近在看《設計模式》和《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();

看了上面的代碼是不是很有感觸,回憶起來了吧,C++里面的抽象類與java里 面的接口很類似,不過C++抽象類允許有成員變量的出現。沒有誰強迫你說抽象類里面的方法不能在抽象類里面實現,但是如果你確實在抽象類里面實現了,那也 只是百搭,因為只有繼承他的子類才能實現,C++只認這個,況且抽象類是不允許被實例化,所以你在抽象類里面實現純虛方法(函數)是多余的。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com