C++中让一个类不能被继承

学过一点java基础的人都知道,在java中让一个类不能被继承,直接在类前面用final关键字修饰就好。但是在C++中如何实现呢?
一般来说有两种思路。
1、将构造函数申明为私有的,然后定义一个静态函数来创建对象,这种很多人都可以想到。但灵活性不好,每次要构造对象的时候还得调用这个静态函数。
2、利用友元不能被继承的特性来做。
1)可以先定义一个没有任何数据成员和成员函数的基类,将其构造函数申明为私有的
2)让不想被继承的类继承为上面那个基类,同时申明为其友元,这里我们为了不必每次要构造一个不能被继承的类时,都要改基类,我们利用模板来泛化基类中的友元类。代码如下:

“`
/*
@author rly
@date 2018.2.3
这是一个验证不让一个类被继承的方法的实例
*/

template
class CfinalClass
{
public:
friend T;
private:
CfinalClass()
{

}
~CfinalClass()
{

}

};

class CParent : public CfinalClass
{
public:
CParent()
{

}
~CParent()
{

}

};
这样我们如果再写一个类Cchild继承CParent类时,由于友元特性不能被继承,此时Cchild类无法访问CfinalClass中的构造函数,从而无法构造对象。
但是结果确实能够构造,这是为什么呢?
因为由于Cchild类继承CParent类, 如果CParent类是普通的公有,保护或私有继承会先调用CParent类的构造函数,CParent类又再先调用CfinalClass类的构造函数再调用自己的构造函数,这明显是可以的啊。

如果能让Cchild类按继承的层级,直接从上到下调用构造函数,而不是通过其父类调用就好了。这里就可以借助虚继承的特性,将CParent类的继承方式改为virtual继承就好了。

更多构造函数特性请参阅《深度探索C++对象模型》一书。

你可能感兴趣的:(C++)