C#和Java都提供了一种机制让一个类不能被担任,如C#中的sealed要害字和Java的final要害字,然而C++措施员就没这么好命了。不外C++也可以模仿出这种结果,道理基于:子类的结构函数会自动挪用父类的结构函数,同理析构函数也是一样。假如父类的结构函数和析构函数被设为私有的话,那么子类就无法挪用,也就到达了父类不行被担任的目标了。道理很简朴,按此道理我也实作出一个自认为很实用的东西类,在此献下丑,接待各人品评:
template< typename TDerive, typename TProvider >
class CFobidDeriveProviderBase
{
friend TDerive;
friend TProvider;
private:
CFobidDeriveProviderBase(){}
~CFobidDeriveProviderBase(){}
};
/*
* 提供克制派生的成果,需要此成果的类可以从CFobidDeriveProvider派生,并将类名作为模板参数通报
*/
template< typename TDerive >
class CFobidDeriveProvider : virtual public CFobidDeriveProviderBase< TDerive, CFobidDeriveProvider<TDerive>>
{
public:
CFobidDeriveProvider(){}
~CFobidDeriveProvider(){}
};
/*
* 测试类,该类不行被担任
*/
class CNoDerive : public CFobidDeriveProvider< CNoDerive >
{
public:
CNoDerive(){}
~CNoDerive(){}
void Alert()
{
AtlMessageBox( NULL, _T("Alert") );
}
};
之所以将担任的布局分为2层:CFobidDeriveProvider和CFobidDeriveProviderBase,主要是利便利用,用户只需直接从CFobidDeriveProvider派生就可实现一个不行被担任的类,而不需要虚拟担任。
若有类从CNoDerive派生:
class CSomeDerive : public CNoDerive
{
public:
CSomeDerive(){}
~CSomeDerive(){}
};
CSomeDerive的结构函数挪用进程如下:由于CFobidDeriveProvider是从CFobidDeriveProviderBase虚拟派生,在虚担任呈现的担任条理中,老是在结构非虚基类之前结构虚基类,因而会跳过CNoDerive和CFobidDeriveProvider的结构函数而直接挪用CFobidDeriveProviderBase的结构函数,但CSomeDerive不是CFobidDeriveProviderBase的友元,因此也无法挪用CFobidDeriveProviderBase的私有结构函数。故而编译错误。