首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中定义密封类?

如何在C++中定义密封类?
EN

Stack Overflow用户
提问于 2011-01-17 20:12:01
回答 6查看 28.9K关注 0票数 57

如何阻止类被其他类继承。

EN

Stack Overflow用户

发布于 2011-01-17 20:51:17

有两种方法,简单、便宜和正确的方法。@Naveen和@Nawaz的两个答案处理了正确的答案,即需要为您实际想要密封的每个类手动创建一个密封器类。

在adobe库中使用的不是最简单的方法是使用模板化的类。问题是您不能将模板参数声明为朋友,这意味着您将不得不从private切换到安全性较低的protected

代码语言:javascript
复制
template <typename T>
class sealer {
protected: sealer() {}
};
class sealed : virtual sealer<sealed> {};

你可以通过一个宏来实现自动化(我不记得Adobe代码中宏的确切风格了):

代码语言:javascript
复制
#define seal( x ) virtual sealer<x>
class sealed : seal(sealed) 
{};

现在,这将捕获那些错误地试图继承而不知道他们不应该继承的人:

代码语言:javascript
复制
class derived : sealed {};
int main() {
   derived d;  // sealer<T>::sealer() is protected within this context
}

但它不会阻止那些真正想要派生的人,因为他们可以通过自己从模板派生来获得对构造函数的访问:

代码语言:javascript
复制
class derived : sealed, sealer<sealed> {};
int main() {
   derived d;
};

我不确定这是否会在C++0x中改变,我想我记得有一些关于是否允许类模板与它的一个参数成为好友的讨论,但粗略地浏览一下草案,我真的不能确定。如果这是允许的,那么这将是一个很好的通用解决方案:

代码语言:javascript
复制
template <typename T>
class sealer {
   sealer() {}
   friend class T; // Incorrect in C++03
};
票数 10
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4712992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档