?
巧用成員模板函數(shù)為你的類留下后門
如果你的類需要擴(kuò)展功能,除了修改源碼之外,你也可以從這個(gè)類派生一個(gè)類來對(duì)這個(gè)類作擴(kuò)充。比如有如下一個(gè)類。
class
cls
{
public
:
???
int
fun(
int
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
類cls有一個(gè)函數(shù)fun能針對(duì)一個(gè)
int
型的數(shù)據(jù)進(jìn)行一些必要的動(dòng)作。現(xiàn)在假如,要對(duì)這個(gè)cls類進(jìn)行功能擴(kuò)充。讓它能針對(duì)一個(gè)
double
型的數(shù)據(jù)進(jìn)行一些動(dòng)作。第一種擴(kuò)充方法是修改類的源碼如下:
class
cls
{
public
:
???
int
fun(
int
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
???
int
fun(
double
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
經(jīng)過對(duì)類cls源碼的修改,cls現(xiàn)在有了針對(duì)的
double
功能了。可是這種改源碼的方法。會(huì)影響到其它的使用到這個(gè)cls類的地方。為了降低這種影響,可以采用從cls類再派生新類的做法,如下:
class
cls2:
public
cls
{
public
:
???
int
fun(
double
a)
??? {
??????
//
一些處理
??????
return
0;
??? }
?
};
經(jīng)過對(duì)派生,現(xiàn)在cls2這個(gè)類擴(kuò)展了cls的功能。現(xiàn)在cls2可以針對(duì)
int
和
double
兩種數(shù)據(jù)類型而做必要的處理了。可是這種通過派生新類的擴(kuò)展,不能使以前就使用cls的用戶直接從中受益。這些用戶想要使用這個(gè)新擴(kuò)展的功能,就必需修改自己的代碼來,添加對(duì)cls2的適應(yīng)。
如果象上面的這種功能擴(kuò)充,要是進(jìn)行多幾次的話,采用第一種方法,就會(huì)經(jīng)歷多次cls類的代碼修改,采用第二種方法,就會(huì)產(chǎn)生多次派生過程。象cls3,cls4等等。而且采用第二種方法還有一個(gè)非常大的不足。那就是派生類不能訪問基類的私有成員。假如擴(kuò)充出來的功能在進(jìn)行處理時(shí)要對(duì)cls中的一些私有成員有所依賴,就不能采用第二種擴(kuò)展方法。
從以上的弊端來看,這兩種功能擴(kuò)展的方法都不是好方法。
下面我們?cè)賮碚f一種進(jìn)行功能擴(kuò)展的方法。要采用這種方法,就需要在cls類在設(shè)計(jì)時(shí)就留出擴(kuò)展口。現(xiàn)在我們重新設(shè)計(jì)cls類如下:
class
cls
{
public
:
???
//
把要傳入的數(shù)據(jù)的地址轉(zhuǎn)為void型的,
???
//
用type來表明進(jìn)行處理時(shí)要對(duì)arg進(jìn)行什么樣的轉(zhuǎn)換
???
int
fun(
void
* arg,
int
type)
??? {
??? ???
switch
(type)
?????? {
??????
case
0:
??????????
//
做針對(duì)int型數(shù)據(jù)的處理
??????????
break
;
??????
default
:
??????????
break
;
?????? }
??????
return
0;
??? }
};
經(jīng)過重新設(shè)計(jì)的cls類,現(xiàn)在要進(jìn)行功能擴(kuò)展的話,只需要在它的函數(shù)fun中多加一條
case
就行了,很方便了。但是這樣的設(shè)計(jì)是脆弱的。函數(shù)fun的兩個(gè)參數(shù)arg和type,非常的不安全,很容易出現(xiàn)搭配錯(cuò)誤。看來我們還要尋找更好的辦法。于是我們?cè)俅涡薷奈覀兊腸ls類如下:
class
cls
{
public
:
???
template
<
typename
T>
???
int
fun( T& arg)
??? {
??????
//
一些處理
??????
return
0;
??? }
};
這一次的cls類的模板成員函數(shù)fun,可以經(jīng)得起功能擴(kuò)充了。擴(kuò)充它的途徑是特化這個(gè)成員模板函數(shù)。例如現(xiàn)在要對(duì)cls進(jìn)行針對(duì)
double
的處理的擴(kuò)展,只需對(duì)fun進(jìn)行double類型的特化如下。
template
<>
int
cls::fun(
double
& arg)
{
???
//
針對(duì)double的一些處理
???
return
0;
}
特化的過程沒有動(dòng)過cls類的一分一毫,也沒有從cls派生任何新類。但我們的
功能擴(kuò)展卻安全的完成
了。這才是我們想要的方便的,安全的功能擴(kuò)展方法。
?
?
?
讓后門支持偏特化
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1546360
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

