如何产生一个不能被继承的类

  对于这个问题,我首先想到的是将“父类”的构造函数声明为私有的,这样的话,子类就不能在自己的构造函数中调用父类的构造函数(就算没有显示调用父类的构造函数,编译器也会自动在子类的构造函数中插入调用父类构造函数的代码),于是就实现了不能被继承的类。同时,我们还是要能够产生这个类的对象,所有要公开一个方法,在该方法中调用私有构造函数。这种解法有点像Singleton。

class CNoChildren{
public:
    CNoChildren* createCNoChildren(){
        CNoChildren* obj = new CNoChildren();
        return obj;
    }
private:
    CNoChildren(){}
};

  但是,上面的代码又是有问题的,因为要调用createCNoChildren()函数,我们必须有个对象,然而构造函数是私有的,那么该如何实例化呢?----只需把方法改为静态的就行。

class CNoChildren{
public:
    static CNoChildren* createCNoChildren(){
        CNoChildren* obj = new CNoChildren();
        return obj;
    }
private:
    CNoChildren(){}
};
   对于上面那种方法,当我们需要一个对象的时候需要使用类中的一个静态方法。那么,是否有办法能够使用new来创建一个不能被继承的类的对象呢?这个我也没想出来,后来在网上发现有个很巧妙的方法,这里分享一下。
 
    想想增加一层抽象性、友元和虚继承。我们把类A的构造函数声明为私有的,然后让类B继承类A,类B的构造函数是public的。然后B就可以直接new出一个对象,为了在B的构造函数中能够调用A的私有的构造,我们把类B声明为类A的友元。
class A{
friend class B;
private:
    A(){}
};

class B:public A{
};

  但是,现在B又可以被其他类继承!!现在考虑一下虚继承。让B虚继承于A,根据虚继承的特性,如果一个类C继承B,那么C需要调用A的构造函数,但是C不是A的友元,不能调用A私有的构造函数。

class A{
friend class B;
private:
    A(){}
};

class B:virtual public A{
};

 

posted @ 2015-07-10 16:52  marchlyp  阅读(393)  评论(0编辑  收藏  举报