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;  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值