C++实现Sealed类

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

[C++实现Sealed类]

今天看到《软件研发5》有一篇译自CUJ的文章“使类不可继承”,方法很好,但有几个毛病:

1. 正如译者说的,还是有办法进行继承,虽然方法有点变态

2. 最主要的毛病却是,这种办法会造成运行时的开销。因为至少会增加VTABLE指针。

所以,针对以上两个问题,作了改动,如下:

#ifdef _DEBUG

namespace internalSealed

{

template<typename T>

class Class_Is_Sealed

{

protected:

Class_Is_Sealed(){};

};

};

template<typename T>

class Sealed: private virtual internalSealed::Class_Is_Sealed<T>

{

friend typename T;

};

#else

template<typename T>

class Sealed

{

};

#endif

这样子,在Debug方式下,只要一个类从Sealed<T>继承,就不可再被继承了。

同时,在Release方式下,因为不再检查是否可以被继承,因而不产生开销(空类会被编译器优化掉)。

使用例子:

#include "Sealed.h"

class test: Sealed<test>

{

public:

int print()

{

return 1;

}

};

class ttt: public test //, Sealed<test>, Sealed<ttt>

{

public:

int print()

{

return 2;

}

};

int main(int argc, char* argv[])

{

test t;

printf("%d\n", t.print());

ttt t1;

printf("%d\n", t1.print());

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航