不能被继承的类

简介:

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

目录
相关文章
|
2月前
|
Java 编译器
继承详解13
继承详解13
33 0
|
5天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
17 1
【C++】继承
|
6月前
|
C++
c++继承
c++继承
54 0
|
3月前
|
C#
C#中的类和继承
C#中的类和继承
44 6
|
6月前
|
安全 编译器 程序员
C++中的继承
C++中的继承
36 2
|
6月前
|
C++
C++之继承<2>【详解】
C++之继承<2>【详解】
|
6月前
|
安全 程序员 C++
C++之继承<1>【详解】
C++之继承<1>【详解】
|
存储 编译器 程序员
c++【继承】
C++ 继承,包括继承的概念和用法,菱形继承的产生,组合的介绍等丰富知识点,详细讲解,干货满满!
42 4
c++【继承】
|
6月前
|
安全 编译器 程序员
【C++】:继承
【C++】:继承
56 0
|
11月前
|
安全 Java 程序员
C++继承
C++继承
50 0