定义一个不能被继承的类

来源:互联网 发布:c语言画玫瑰花程序 编辑:程序博客网 时间:2024/05/21 08:45

学习完C++我们知道了,类是可以被继承的,而继承也分为三种就是:public、private、protected。那么我们如何定义一个不能被继承的类呢?
在C++里面子类的构造函数会去调父类的构造函数,而子类的析构函数也会去调父类的析构函数。如果我们想让一个类不能被继承,那么就把它的构造函数和析构函数定义为私有的,这样当一个类去继承时调构造函数和析构函数的时候就会发生编译错误。可是这样又会引发一个新的问题:我们如何去实例化这个类呢?
解决方法:
1、在这个类里面创建一个对象来提供一个静态的接口,返回创建的这个对象。但是在定义类的对象时不太好。
代码如下:

class FinalClass1{public :      static FinalClass1* GetInstance()//静态的接口      {            return new FinalClass1;//返回这个对象      }      static void DeleteInstance( FinalClass1* pInstance)      {            delete pInstance;            pInstance = 0;      }private :      FinalClass1() {}      ~FinalClass1() {}};

这个类是不能被继承的,但是这个类和其它类有不一样的地方。就是这个类只能创建在堆上的实例,却创建不了在栈上的实例。这样就很遗憾,它不能和一般类一样的使用啊,那就是下面这个方法了。
2、我们先声明一个辅助类A,类A把这个类的构造函数声明为私有的,要让类B称为类A 的友元类,还得要B虚继承A。这样别的类就不能继承B了。

现在类C来继承类B,C在初始化的时候会去调用B的构造函数,但是B虚继承A。为了防止产生二义性,C必须先调用A的构造函数,但是A的构造函数是私有的不能去访问,所以产生错误,继承就失败。
代码如下:

class B;  //设计一个不能被继承的类  class A  {         friend B;  private:         A()         {}  };  class B :virtual public A  //B虚继承A{  public:         B(int b)         {                _b = b;         }         void Display()         {                cout << _b << endl;         }  private:         int _b;  };  class D:public B  {  public:         D(int b,int d)            //A的构造函数不可访问,产生错误                :B(b)                , _d(d)         {}        private:         int _d;  };  

这样通过友元和虚继承的方法就能实现,定义出了一个不能被继承的类。

0 1
原创粉丝点击