JAVA中定义FINAL标明该类为不能继承的类。而在c++中并没有相类似的定义的关键字。如何实现一个不能继承的类呢?
很多人一初始便会想到定义一个构造函数和拷贝构造函数和析构函数为私有属性,便阻止了其它的类对该类的继承啦。代码如下:
class A{
private:
A();
~A();
};
<span style="font-family: Arial, Helvetica, sans-serif;">class B:public A{</span>
/*............*/
}
此时编译器便会报错A::A()是私有的A::~A()是私有的,达到了所谓不能继承的目的。
然而此时对于A来说的话因为构造函数为私有的也就意味着如果你写出A a等实例化A对象的代码也必然会失败。这个时候我们可以通过另外一个static函数用来返回一个实例。代码如下:
class A{
private:
A();
~A();
public:
static A getInstance(){
A *a=new A;
return A;
}
}
这里采取打策略是定义为static关键字的函数为类所有,可以调用。此时便完成了我们所需要打功能,这个也就是所谓打单例模式。
还有一种更好的方式。
<pre name="code" class="cpp">template<typename T>
class base{
friend T;
private:
base(){}
~base(){}
};
class derived: virtual public base<derived>{
};
这个时候对于derived类来说是一个不能被继承的类。因为derived 虚拟继承一个base,若有类再继承derived的时候,因为virtual的执行语义构造函数要在最后一层构造出base然而此时由于不是其友员且构造函数为私有故而报错,达到了不能继承的目的。