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