如何创建一个不能被继承的类

来源:互联网 发布:大数据技术体系建设 编辑:程序博客网 时间:2024/05/22 03:33

在JAVA中,有final关键字;在C#中,有sealed关键字表明这个类不能被继承。但是C++中没有这个关键字,所以想达到这样的目的还是得费点功夫。

先看程序吧:

class Uninheritable {friend Base;private:Uninheritable(){}};class Base:public Uninheritable{};class Drived:public Base{};


Base的构造函数需要调用Uninheritable的构造函数。虽然Uninheritable的构造函数为private,没有被继承;但是因为Base是它的友元,所以可以访问。从Base继承下来的Drived已经不是Uninheritable的友元了,他的构造函数需要访问Base的构造函数,Base的构造函数是可以访问Uninheritable的
,所以它也可以被继承。

但是只要让Drived的构造函数直接调用Uninheritable的构造函数,就能解决这个问题了,于是我们想到了虚继承。虚继承以后,派生类会从顶向下一级一级调用构造函数,所以Drived的构造函数会直接调用Uninheritable的构造函数,从而导致失败:

class Base:virtual public Uninheritable{};class Drived:public Base{};

然后把上面的类改写成模板类:

//声明template<typename T>class Base;template<typename T>class Uninheritable{friend Base<T>;private:Uninheritable(){}};template<typename T>class Base:virtual public Uninheritable<T>{};template<typename T>class Drived:public Base<T>{};