一 C++虛擬函數(C++ virtual function)雜談
我們在編程的時候,經常會遇到這樣的情況,假設有兩個對象,你要在函數中分別調用它們的OnDraw方法,我們以前的做法一般是這樣的。
void f(int iType)
{
switch(iType)
{
case 1:
//CCircle OnDraw
break;
case 2:
//CRectangle OnDraw
break;
}
}
這種方法當然能解決我們的問題,但是如果有新的類型要增加,它就必須要往下加代碼才行了,這樣函數裡的代碼會越寫越長。你可能會想我的類型不多,往下加也不會太長,但是這種想法是不可取的,因為實際工作當中,我們經常遇到的情況是,一個系統可能要維護好幾年,甚至10幾年都會有,所以不可預知的事情很多,做設計的時候不能有這種僥幸心裡。C++中提供了虛函數,可以方便我們解決這個問題。
class CShape
{
public:
virtual void OnDraw(){}
};
class CCircle:public CShape
{
public:
void OnDraw()
{
cout<<"CCircle OnDraw"< } }; class CRectangle: public CShape { void OnDraw() { cout<<"CRectangle OnDraw"< } }; 定義一個接口函數,把基類作為型參,對象傳入後就可以調用到對應的函數了。 void SelfDraw(CShape *_shap) { _shap->OnDraw(); } 在調用的時候只需要寫類似如下的代碼。 CCircle c1; CRectangle r1; SelfDraw(&c1); SelfDraw(&r1); 程序編譯運行後的結果如下。 <喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+v8nE3LjV0adjJiM0MzsmIzQzO7K7vsO1xMXz09Gyu9aqtcDOqsqyw7S/ydLU1eLR+cq508OjrM6qyrLDtLv5wOC/ydLU1f3It7XEtffTw7W919PA4LXEuq/K/aOsxMfDtMjDztLDx8C0v7S/tMPYw9y1vbXX1NrExMDvsMmhozwvcD4KPHA+IDxpbWcgc3JjPQ=="" alt="\"> 秘密就是__vfptr(virtual function pointer),__vfptr是一個指針數組指向虛函數,當CCircle對象傳入基類指針後,虛函數指針會指向CCircle重載的OnDraw函數,所以我們就會看到SelfDraw中_shap->OnDraw()可以正確調用到它對應子類函數了。