有两种方法,一种是简单便宜的,一种是正确的。 @Naveen 和 @Nawaz 的两个答案是正确的,这需要为您实际想要密封的每个类手动创建一个 sealer 类。
在 adobe 库中使用的并非万无一失的方法是为此使用模板类。问题是您不能将模板参数声明为朋友,这意味着您将不得不从private 切换到不太安全的protected:
template <typename T>
class sealer {
protected: sealer() {}
};
class sealed : virtual sealer<sealed> {};
您可以使用宏自动执行它(我不记得 Adobe 代码中宏的确切风格):
#define seal( x ) virtual sealer<x>
class sealed : seal(sealed)
{};
现在这将抓住那些在不知道自己不应该继承的情况下错误地尝试继承的人:
class derived : sealed {};
int main() {
derived d; // sealer<T>::sealer() is protected within this context
}
但它不会阻止真正想要派生的人,因为他们可以通过自己从模板派生来访问构造函数:
class derived : sealed, sealer<sealed> {};
int main() {
derived d;
};
我不确定这是否会在 C++0x 中改变,我想我记得一些关于是否允许类模板与它的参数之一成为朋友的讨论,但在粗略搜索草稿时,我真的无法确定.如果允许,那么这将是一个很好的通用解决方案:
template <typename T>
class sealer {
sealer() {}
friend class T; // Incorrect in C++03
};