巧用成員模板函式為你的類留下後門
如果你的類需要擴充套件功能,除了修改原始碼之外,你也可以從這個類派生乙個類來對這個類作擴充。比如有如下乙個類。
class
cls
}; 類cls有乙個函式fun能針對乙個int型的資料進行一些必要的動作。現在假如,要對這個cls類進行功能擴充。讓它能針對乙個double型的資料進行一些動作。第一種擴充方法是修改類的原始碼如下:
class
cls
int fun( double a)
};經過對類cls原始碼的修改,cls現在有了針對的double功能了。可是這種改原始碼的方法。會影響到其它的使用到這個cls類的地方。為了降低這種影響,可以採用從cls類再派生新類的做法,如下:
class
cls2: public cls
}; 經過對派生,現在cls2這個類擴充套件了cls的功能。現在cls2可以針對int和double兩種資料型別而做必要的處理了。可是這種通過派生新類的擴充套件,不能使以前就使用cls的使用者直接從中受益。這些使用者想要使用這個新擴充套件的功能,就必需修改自己的**來,新增對cls2的適應。
如果象上面的這種功能擴充,要是進行多幾次的話,採用第一種方法,就會經歷多次cls類的**修改,採用第二種方法,就會產生多次派生過程。象cls3,cls4等等。而且採用第二種方法還有乙個非常大的不足。那就是派生類不能訪問基類的私有成員。假如擴充出來的功能在進行處理時要對cls中的一些私有成員有所依賴,就不能採用第二種擴充套件方法。
從以上的弊端來看,這兩種功能擴充套件的方法都不是好方法。
下面我們再來說一種進行功能擴充套件的方法。要採用這種方法,就需要在cls類在設計時就留出擴充套件口。現在我們重新設計cls類如下:
class
cls
return 0;
} };
經過重新設計的cls類,現在要進行功能擴充套件的話,只需要在它的函式fun中多加一條case就行了,很方便了。但是這樣的設計是脆弱的。函式fun的兩個引數arg和type,非常的不安全,很容易出現搭配錯誤。看來我們還要尋找更好的辦法。於是我們再次修改我們的cls類如下:
class
cls
}; 這一次的cls類的模板成員函式fun,可以經得起功能擴充了。擴充它的途徑是特化這個成員模板函式。例如現在要對cls進行針對double的處理的擴充套件,只需對fun進行double型別的特化如下。
template
<>
intcls::fun(double& arg)
特化的過程沒有動過cls類的一分一毫,也沒有從cls派生任何新類。但我們的功能擴充套件卻安全的完成了。這才是我們想要的方便的,安全的功能擴充套件方法。
讓後門支援偏特化
巧用成員模板函式為你的類留下後門
巧用成員模板函式為你的類留下後門 如果你的類需要擴充套件功能,除了修改原始碼之外,你也可以從這個類派生乙個類來對這個類作擴充。比如有如下乙個類。class cls 類cls有乙個函式fun能針對乙個int型的資料進行一些必要的動作。現在假如,要對這個cls類進行功能擴充。讓它能針對乙個double型...
巧用成員模板函式為你的類留下後門
巧用成員模板函式為你的類留下後門 如果你的類需要擴充套件功能,除了修改原始碼之外,你也可以從這個類派生乙個類來對這個類作擴充。比如有如下乙個類。class cls 類cls有乙個函式fun能針對乙個int型的資料進行一些必要的動作。現在假如,要對這個cls類進行功能擴充。讓它能針對乙個double型...
巧用成員模板函式為你的類留下後門
巧用成員模板函式為你的類留下後門 如果你的類需要擴充套件功能,除了修改原始碼之外,你也可以從這個類派生乙個類來對這個類作擴充。比如有如下乙個類。class cls 類cls有乙個函式fun能針對乙個int型的資料進行一些必要的動作。現在假如,要對這個cls類進行功能擴充。讓它能針對乙個double型...