C++单例不可继承

C++语言和单例的特性决定了单例不可继承。

单例有如下几项要求:

1. 构造函数为私有,或者至少不可以被此类的继承体系以外的类访问当,即要么是private,最坏也是protected

2. 构造函数只被调用一次,以初始化static对象。

所以如果B1,B2,继承至单例A,则不可以实现在程序运行的整个过程中既有一个B1单例又有一个B2单例,而且两个单例不存在依赖关系,原因是B1、B2共享一个A基类,而B1和B2的静态对象声明在A中,即两者共享一个base静态对象,因此对B1和B2两次调用初始化函数(GetInstance)时候,实际上基类A的静态对象会有两次初始化的动作(GetInstance),当然,基类的静态对象只会实例化一次,具体实例化位子类的B1还是B2类型,要看两个子类实例化调用的先后次序。

所以即使两个实例化都第一次调用GetInstance,也只实例化了一份静态对象,并且被两个类共享。这样的单例没有意义。

#include <iostream>  

using namespace std;

class CSingleton  
{  
public:  
	static CSingleton * GetInstance()  
	{  
		//if(NULL == m_pInstance)  
		//	m_pInstance = new CSingleton();  
		//return m_pInstance;  
	}  
	static void Release()   //必须,否则会导致内存泄露  
	{  
		if(NULL != m_pInstance)  
		{  
			delete m_pInstance;  
			m_pInstance = NULL;  
		}  
	}

	virtual void printfname()
	{
		printf("name : CSingleton\n");
	}

protected:  
	CSingleton()  
	{  
		cout<<"CSingleton"<<endl;  
	};  
	static CSingleton * m_pInstance;  
};  

CSingleton* CSingleton::m_pInstance = NULL;  

class CSingleDraw:public CSingleton  
{  
public:  
	static CSingleDraw* GetInstance()  
	{  
		if(NULL == m_pInstance)  
			m_pInstance = new CSingleDraw();  
		return (CSingleDraw*)m_pInstance;  
	}
	virtual void printfname()
	{
		printf("name : CSingleDraw\n");
	}
protected:  
	CSingleDraw()  
	{  
		cout<<"CSingleDraw"<<endl;  
	}  
};  

class CSingleDraw1:public CSingleton  
{  
public:  
	static CSingleDraw1* GetInstance()  
	{  
		if(NULL == m_pInstance)  
			m_pInstance = new CSingleDraw1();  
		return (CSingleDraw1*)m_pInstance;  
	}
	virtual void printfname()
	{
		printf("name : CSingleDraw1\n");
	}
protected:  
	CSingleDraw1()  
	{  
		cout<<"CSingleDraw"<<endl;  
	}  
};  

int main()  
{  
	//CSingleton *x = CSingleton::GetInstance();
	CSingleDraw* s1 = CSingleDraw::GetInstance();
	CSingleDraw1* s2 = CSingleDraw1::GetInstance(); 
	
	//x->printfname();
	s1->printfname();
	s2->printfname();

	s1->Release();

	system("pause");
	return 0;

相关推荐