這個問題的另一個部分,由于邏輯上的原因如何防止類被繼承,有一個解決方案。不幸的是,這個方案并不完美。它建立在這樣一個事實的基礎之上,那就是:大多數的繼承類必須建立一個虛擬的基類。這是一個例子:
class Usable;
class Usable_lock {
friend class Usable;
private:
Usable_lock() {}
Usable_lock(const Usable_lock&) {}
};
class Usable : public virtual Usable_lock {
// ...
public:
Usable();
Usable(char*);
// ...
};
Usable a;
class DD : public Usable { };
DD dd; // 錯誤: DD::DD() 不能訪問
// Usable_lock::Usable_lock()是一個私有成員
(來自《C++語言的設計和演變》11.4.3)
為什么不能為模板參數定義約束(constraints)?
可以的,而且方法非常簡單和通用。
看看這個:
template<class Container>
void draw_all(Container& c)
{
for_each(c.begin(),c.end(),mem_fun(&Shape::draw));
}
如果出現類型錯誤,可能是發生在相當復雜的for_each()調用時。例如,如果容器的元素類型是int,我們將得到一個和for_each()相關的含義模糊的錯誤(因為不能夠對對一個int值調用Shape::draw的方法)。
為了提前捕捉這個錯誤,我這樣寫:
template<class Container>
void draw_all(Container& c)
{
Shape* p = c.front(); // accept only containers of Shape*s
for_each(c.begin(),c.end(),mem_fun(&Shape::draw));
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/