用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)

时间:2022-08-09 16:41:19

        据我们知道,我们只要把类的构造函数和析构函数定义为private类型,那么就不能够在外部建立给类的对象,也就不能以给类为基类进行继承,因为如果继承,建立对象的时候将要调用基类的构造函数,但是因为为private,所以派生类调用基类构造函数的时候,将会连接失败,这样达到不能被继承的任务,但是缺憾是我们不能够在类外部定义该类的对象。那么应该怎么解决呢?????

下面给出代码

template<class T>class base
{
 friend T;//声明友类
private:
 base(){}
   ~base(){}
};
class derived:public virtual base<derived>
{
public:
 derived(){}
   ~derived(){}
};

用上面的方法,我们所定义的类derived类可以达到不能被继承,但是能够在类外部定义对象的目的,这是为什么呢?????

首先我们可以看到derived雷虚拟继承base类,在模板展开的时候derived类被声明为base类的友类,因此可以访问base中的private部分,所以也就可以调用base中的被定义为private的构造函数和析构函数,所以定义derived类型的对象没有任何问题。

现在我们假设有一个类要继承derived,形如:

class  derived1:public derived

{

 

}

derived1类是不能够被实例化的,这又是为什么呢?????

我们在c++对象模型中知道,构造顺序是,虚拟基类-----基类------虚拟指针--------初始化列表中的-------构造函数内部的语句

所以我们就可以知道先会derived1调用虚拟基类base的构造函数,但是对于derived1来说,base的构造函数是不能访问的,因为base的构造函数被定义为private,并且derived1不是base的友类,所以在用derived1构造对象的时候,连接错误,也就说明derived是不能够被继承的。

经过上面分析我们就达到了设计目的。