1.7 Policy Classes的析構(gòu)函數(shù)
我們已知host class從policy class公有繼承。那么將一個指向host class對象的policy class指針delete,將會產(chǎn)生不可預(yù)期的結(jié)果。解決方法有三:
1、將policy的析構(gòu)函數(shù)聲明為虛函數(shù)。但這樣會妨礙policy的靜態(tài)連接特性,也會影響執(zhí)行效率。第一個虛函數(shù)的加入會使對象大小帶來額外開銷。
2、采用protected繼承或private繼承(派生類指針將不能轉(zhuǎn)化為基類指針,cuigang)。但policy的函數(shù)則不能對外訪問,失去用戶擴(kuò)充的特性(見1.6節(jié))。
3、定義一個非虛的protected析構(gòu)函數(shù)。(不能對基類指針delete,因為析構(gòu)函數(shù)不可訪問,cuigang)
方法3顯然沒有1、2的副作用。
1.8 通過不完全具現(xiàn)化而獲得的選擇性機(jī)能
更進(jìn)一步。由于對于模板類中的成員函數(shù),如果未曾用到,那么它就不會被編譯器具現(xiàn)出來,有的編譯器甚至不對其進(jìn)行語法檢查。如此便導(dǎo)致host class有機(jī)會指明并使用policy class的可選特性。如:
1 template < template <class> class CreationPolicy >
2 class WidgetManager : public CreationPolicy<Widget>
3 {
4 //
5 void SwitchPrototype(Widget* pNewPrototype)
6 {
7 CreationPolicy<Widget>& myPolicy = *this;
8 delete myPolicy.GetPrototype();
9 myPolicy.SetPrototype(pNewPrototype);
10 }
11 }
那么
1、如果你采用的CreationPolicy支持GetPrototype(),那么使用WidgetManager::SwitchPrototype()沒問題。
2、如果你采用的CreationPolicy不支持GetPrototype(),那么使用WidgetManager::SwitchPrototype()編譯出錯。
3、如果你采用的CreationPolicy不支持GetPrototype(),但是沒有使用WidgetManager::SwitchPrototype(),那么沒問題!!!
那么host class的作者就可以利用這種不完整具現(xiàn)化(incomplement instantiation),預(yù)定義一些可選的方法。