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