程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 實用泛型編程之 虛擬函數(C++ virtual function)雜談

C++ 實用泛型編程之 虛擬函數(C++ virtual function)雜談

編輯:C++入門知識

C++ 實用泛型編程之 虛擬函數(C++ virtual function)雜談


一 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()可以正確調用到它對應子類函數了。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved