浏览 4986 次
锁定老帖子 主题:如何有效地禁止类继承
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-08-18
在 Java 等语言中有一个关键字:final,该关键字专门用于禁止类继承的功能,而在以往的C++中却没有此关键字(据说最新的 C++ 规范增加了此关键字,但还未普及),在 acl_cpp 库中通过模板方式设计了 final 类的功能,下面是一个例子:
#include "stdafx.h" #include <stdio.h> #include "final_tpl.hpp" // 类 CMyFinalClass 禁止被子类继承 class CMyFinalClass : public acl::final_tpl<CMyFinalClass> { public: CMyFinalClass(int n) : dummy_(n) {} ~CMyFinalClass() {} void Test() { printf("hello, I'm the final class\n"); } protected: private: int dummy_; }; class CMyClass //: CMyFinalClass, 如果 CMyClass 继承 CMyFinalClass 则编译器会报错 { public: CMyClass() {} ~CMyClass() {} }; int main(void) { CMyFinalClass m(1); m.Test(); printf(">>enter any key to exit ...\n"); getchar(); return 0; } 虽然还有其它方法实现禁止类继承的功能,但不如上述方法通用。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-20
你不就为了推广acl_cpp嘛。。。哎
|
|
返回顶楼 | |
发表时间:2012-08-20
mybreeze77 写道 你不就为了推广acl_cpp嘛。。。哎 对啊,这有问题吗? |
|
返回顶楼 | |
发表时间:2012-08-20
最后修改:2012-08-20
下面是模板类的实现(为了保证在WIN32/LINUX都能使用,的确花费了点功夫)
#pragma once namespace acl { #ifdef WIN32 template<typename TDerive, typename TProvider> class final_tpl_base { friend TDerive; friend TProvider; private: final_tpl_base() {} ~final_tpl_base() {} }; #else template <typename T> class identity { public: typedef T me; }; template<typename TDerive, typename TProvider> class final_tpl_base { friend class identity<TDerive>::me; friend class identity<TProvider>::me; private: final_tpl_base() {} ~final_tpl_base() {} }; #endif /* * 提供禁止派生的功能,需要此功能的类可以从final_tpl派生, * 并将类名作为模板参数传递 * @example: * class my_final_class : public acl::final_tpl <my_final_class> * { * public: * my_final_class() {} * ~my_final_class() {} * } * 这样就保证了 my_final_class 是不能被继承的 */ template<typename TFinalClass> class final_tpl : virtual public final_tpl_base<TFinalClass, final_tpl<TFinalClass> > { public: final_tpl() {} ~final_tpl() {} }; } |
|
返回顶楼 | |
发表时间:2012-08-20
如果你禁止继承,那为什么还要说“复用”?程序员是个矛盾体,一方面做所谓的封装来避免暴漏自己认为是细节的部分于是有private、final这种东西的出现;另一方面却呼吁所谓的软件复用。且不说可是这些关键字在技术上是完全可以绕过去的,单单是这种“坚决”禁止的态度是否就有问题?或者说我们把封装理解为语法层次的限制是否我们太狭隘了?
|
|
返回顶楼 | |
发表时间:2012-08-20
复用与继承是两个不同的概念,不可混为一谈
|
|
返回顶楼 | |
发表时间:2012-09-04
nested class天然不能被继承
|
|
返回顶楼 | |
发表时间:2012-12-18
fireflyc 写道 如果你禁止继承,那为什么还要说“复用”?程序员是个矛盾体,一方面做所谓的封装来避免暴漏自己认为是细节的部分于是有private、final这种东西的出现;另一方面却呼吁所谓的软件复用。且不说可是这些关键字在技术上是完全可以绕过去的,单单是这种“坚决”禁止的态度是否就有问题?或者说我们把封装理解为语法层次的限制是否我们太狭隘了?
前辈,有些类不希望被继承是为了避免一些错误吧? 类似于 java 的String类。 |
|
返回顶楼 | |
发表时间:2012-12-18
如果你设计的类不希望被继承,最好就是明确指出来,这样在编译阶段就禁止非法继承了,免得运行时出错难以诊断。
|
|
返回顶楼 | |