不能被继承的类

简介:

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

目录
相关文章
|
6月前
|
Java 编译器 程序员
关于继承是怎么样的?那当然是很好理解之
关于继承是怎么样的?那当然是很好理解之
31 1
|
6月前
|
C++
c++继承
c++继承
48 0
|
3月前
|
C#
C#中的类和继承
C#中的类和继承
41 6
|
5月前
|
编译器 C++
C++中的继承
C++中的继承
45 1
|
存储 编译器 程序员
c++【继承】
C++ 继承,包括继承的概念和用法,菱形继承的产生,组合的介绍等丰富知识点,详细讲解,干货满满!
38 4
c++【继承】
|
6月前
|
存储 设计模式 Java
C++【继承】
C++【继承】
68 0
C#之继承
C#之继承
74 0
继承类的方法
继承类的方法
111 0
|
编译器 测试技术 C++
复杂的C++继承
复杂的C++继承