在系统开发过程中,我们需要通过对程序进行特殊的限制来表达那些是接口,那些是内部的实现。而C++不像Java或C#。拥有public class或者interface的keyword。
在这里介绍在C++中如何限制类或函数被派生。首先我们看几个例子。
class InterClass{
};
class B :public InterClass
{
};
在这里InterClass只是一个内部的实现,模块的开发人员可能在下一个版本中由于需要将这个类重构,或完全删除这个类。这个时候派生于这个类的类B,在拿到新的版本后,就会有很大的代码变化,同时需要进行大量的测试。
class A{
public:
virtual void Interfunc();
}
class B: public A{
public:
virtual void Interfunc();
}
class A{
public:
void Interfunc(); //remove virtual
}
class B: public A{
public:
virtual void Interfunc();
}
上面这个例子是A定义了虚函数virtual void Interfunc();。但这个虚函数在重构之后取消了虚函数的特性。那么派生类B可能还认为是虚函数。导致bug产生。
首先,那么我们看怎么在C++禁止一个类被派生。首先在VC11中使用了final的keyword。用来修饰class。使用这个keyword可以保证该类不被派生。
但是目前我们还没有这个keyword。我做了一个简单的代码可以帮助实现这个功能
class FinalSupportClass
{
protected:
FinalSupportClass()
{
}
};
#define FINALCLASS : virtual private FinalSupportClass
不想被派生的类可以使用这个宏
class FinalClass FINALCLASS // the class which is final class use this marco
{
};
class A: public FinalClass
{
};
int _tmain(int argc, _TCHAR* argv[])
{
A a; // an error reported when compile
return 0;
}
对于虚函数的限制在VC10中可以使用sealed这个keyword
class A
{
public:
virtual void func() sealed{} ;
};
class B:public A
{
public:
virtual void func(){} ; // an error reported when compile
};
另外派生类在派生虚函数的时候可以使用override。这样当基类取消了虚函数后,就会在编译阶段出现错误。