不能被继承的类,就是子类在调用父类的构造函数的时候失败就没法被集成了,所以可以把析构函数定义为private,因为在调用构造函数的时候,会先检查析构函数,如果析构是private的,那么构造函数也没法被调用。
这个问题和另一篇文章类似http://blog.csdn.net/u011156012/article/details/24979913,我们通过设置共有的static函数来构造和析构。
class A { private: A(){} ~A(){} public: static A* create() { return new A(); } void destory() { delete this; } };
这样的类只能在堆上实现,也就是只能通过new出来,而不能在栈上实现。利用虚继承,我们可以同时在堆上和栈上都可以实现这个类的实例。
template <typename T> class MakeSealed{ friend T; private: MakeSealed() {} ~MakeSealed() {} }; class SealedClass: virtual public MakeSealed<SealedClass>{ public: SealedClass() {} ~SealedClass() {} };
在这个SealedClass使用起来和一般的类型没什么区别,我们可以在栈上 ,堆上创建实例,尽管类MakeSealed的构造函数是private的,但是因为类SealedClass是它的友元类,因此在SealedClass中可以调用它的私有函数。
但是当我们试图从SealedClass中继承一个类并创建它的实例的时候,却不能编译通过,例如:
class Try: public SealedClass{ public: Try() {} ~Try() {} };由于SealedClass是虚继承自MakeSealed<SealedClass>的,在调用Try时,不会调用SealedClass的构造函数,而是会跳过SealedClass去调用MakeSealed<SealedClass>的构造函数,但是因为Try不是MakeSealed的友元类,所以无法调用其构造函数。这样就打到了题目的要求,prefect!