黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

巧用成員模板函數(shù)為你的類留下后門

系統(tǒng) 2554 0
?
巧用成員模板函數(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ù)為你的類留下后門


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論