当前位置:天才代写 > tutorial > C语言/C++ 教程 > 探讨C++实现一个不行被担任的类

探讨C++实现一个不行被担任的类

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:342

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的私有结构函数。故而编译错误。

 

    关键字:

天才代写-代写联系方式