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;