android父类调用子类函数,父类可以调用其子类版本的函数

通过使用内部类,可以通过调用虚拟函数来填充资源。这是一个例子

#ifndef CLAZYSTATICRESOURCINITIALIZATIONASPECT_H

#define CLAZYSTATICRESOURCINITIALIZATIONASPECT_H

#include

template

class CLazyStaticResourceInitialization

{

public:

/**

* Destructor

*/

virtual ~CLazyStaticResourceInitialization()

{

}

protected:

/**

* Internal class used for calling virtual function from constructor

*/

struct parent_virtual

{

/**

* Virtual destructor

*/

virtual ~parent_virtual ()

{

}

/**

* Virtual method implemented by parent class is necessary

*/

virtual void initializeOnce () const

{

}

};

/**

* Constructor that can call a virtual function of the parent

* @param obj specifies the virtual function

*/

CLazyStaticResourceInitialization(const parent_virtual& obj )

{

boost::mutex::scoped_lock scoped_lock(m_Mutex);

//Initialize the resource only once

if (isInitialized () == false)

{

obj.initializeOnce ();

setInitialized ();

}

}

/**

* Returns if any instance of this class has been initialized or not

* @return true if initialized, false otherwise

*/

bool isInitialized () const

{

return m_bInitialized;;

}

/**

* Returns if any instance of this class has been initialized or not

*/

void setInitialized ()

{

m_bInitialized = true;

}

protected:

/**

* The flag that indicates whether this class is initialized or not

*/

static volatile bool m_bInitialized;

/**

* The resource instance

*/

static R m_Resource;

/**

* The mutex to protect initialized flag

*/

static boost::mutex m_Mutex;

};

//Assume that this class is not initialized in the beginning

template volatile bool CLazyStaticResourceInitialization::m_bInitialized = false;

//Create a static instance of resource

template R CLazyStaticResourceInitialization::m_Resource;

//Create a static instance of mutex

template boost::mutex CLazyStaticResourceInitialization::m_Mutex;

#endif

这是您如何使用它

class CTestLazyInitialized : public CLazyStaticResourceInitialization <:vector> >

{

public:

CTestLazyInitialized():

CLazyStaticResourceInitialization<:vector> >(lazyderived_virtual())

{

}

unsigned int size ()

{

return this->m_Resource.size ();

}

protected:

struct lazyderived_virtual : public CLazyStaticResourceInitialization <:vector> >::parent_virtual

{

lazyderived_virtual ()

{

}

void initializeOnce () const

{

m_Resource.push_back (1);

}

};

};

只需注意基类和派生类中使用的内部类即可。对于您的情况,可以忽略互斥锁和模板内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值