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;
相关推荐
worldsnow 2020-11-06
csdnxingyuntian 2020-11-02
丽丽 2020-10-30
bluecarrot 2020-09-17
哈嘿Blog 2020-08-16
qidiantianxia 2020-08-16
84931231 2020-07-30
ChenRuiyz 2020-07-26
yanqianglifei 2020-07-07
wbczyh 2020-07-05
BOBShe 2020-07-03
yang0cs 2020-06-28
fushilin 2020-06-28
清水寺小僧 2020-06-25
uileader 2020-06-21
wangyangsoftware 2020-06-16
cleanerxiaoqiang 2020-06-16
xuguiyi00 2020-06-14