?
巧用成員模板函數為你的類留下后門
如果你的類需要擴展功能,除了修改源碼之外,你也可以從這個類派生一個類來對這個類作擴充。比如有如下一個類。
class
cls
{
public
:
???
int
fun(
int
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
類cls有一個函數fun能針對一個
int
型的數據進行一些必要的動作。現在假如,要對這個cls類進行功能擴充。讓它能針對一個
double
型的數據進行一些動作。第一種擴充方法是修改類的源碼如下:
class
cls
{
public
:
???
int
fun(
int
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
???
int
fun(
double
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
經過對類cls源碼的修改,cls現在有了針對的
double
功能了。可是這種改源碼的方法。會影響到其它的使用到這個cls類的地方。為了降低這種影響,可以采用從cls類再派生新類的做法,如下:
class
cls2:
public
cls
{
public
:
???
int
fun(
double
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
?
};
經過對派生,現在cls2這個類擴展了cls的功能。現在cls2可以針對
int
和
double
兩種數據類型而做必要的處理了。可是這種通過派生新類的擴展,不能使以前就使用cls的用戶直接從中受益。這些用戶想要使用這個新擴展的功能,就必需修改自己的代碼來,添加對cls2的適應。
如果象上面的這種功能擴充,要是進行多幾次的話,采用第一種方法,就會經歷多次cls類的代碼修改,采用第二種方法,就會產生多次派生過程。象cls3,cls4等等。而且采用第二種方法還有一個非常大的不足。那就是派生類不能訪問基類的私有成員。假如擴充出來的功能在進行處理時要對cls中的一些私有成員有所依賴,就不能采用第二種擴展方法。
從以上的弊端來看,這兩種功能擴展的方法都不是好方法。
下面我們再來說一種進行功能擴展的方法。要采用這種方法,就需要在cls類在設計時就留出擴展口。現在我們重新設計cls類如下:
class
cls
{
public
:
???
//
把要傳入的數據的地址轉為void型的,
???
//
用type來表明進行處理時要對arg進行什么樣的轉換
???
int
fun(
void
* arg,
int
type)
??? {
??? ???
switch
(type)
?????? {
??????
case
0:
??????????
//
做針對int型數據的處理
??????????
break
;
??????
default
:
??????????
break
;
?????? }
??????
return
0;
??? }
};
經過重新設計的cls類,現在要進行功能擴展的話,只需要在它的函數fun中多加一條
case
就行了,很方便了。但是這樣的設計是脆弱的。函數fun的兩個參數arg和type,非常的不安全,很容易出現搭配錯誤。看來我們還要尋找更好的辦法。于是我們再次修改我們的cls類如下:
class
cls
{
public
:
???
template
<
typename
T>
???
int
fun( T& arg)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
這一次的cls類的模板成員函數fun,可以經得起功能擴充了。擴充它的途徑是特化這個成員模板函數。例如現在要對cls進行針對
double
的處理的擴展,只需對fun進行double類型的特化如下。
template
<>
int
cls::fun(
double
& arg)
{
???
//
針對double的一些處理
???
return
0;
}
特化的過程沒有動過cls類的一分一毫,也沒有從cls派生任何新類。但我們的
功能擴展卻安全的完成
了。這才是我們想要的方便的,安全的功能擴展方法。
?
?
?
讓后門支持偏特化
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1546360
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
