如何阻止类被其他类继承。
发布于 2011-01-17 20:51:17
有两种方法,简单、便宜和正确的方法。@Naveen和@Nawaz的两个答案处理了正确的答案,即需要为您实际想要密封的每个类手动创建一个密封器类。
在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
};https://stackoverflow.com/questions/4712992
复制相似问题