不能被继承的类

不能被继承的类,就是子类在调用父类的构造函数的时候失败就没法被集成了,所以可以把析构函数定义为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!

上一篇:【一问一答】错题库整理


下一篇:如何在高版本的Xcode中部署低版本的ios程序