不能被继承的类

来源:互联网 发布:郭德纲网络剧 编辑:程序博客网 时间:2024/06/04 18:56

解题思路:

1、C++中的子类构造函数会自动的调用父类的构造函数,子类析构函数会自动调用父类的析构函数。那么把构造和析构函数定义为私有的,就不能被继承了。

2、缺陷:定义为私有函数时,要在类外创建类的对象,只能实现成要么在栈上创建要么在堆上创建。

//因为构造函数和析构函数都为私有的,所以他不能被继承//缺陷:它只能在堆上生成,不能在栈上生成。class A{public:static A& GetObject(int a){return *new A(a);}private: //把构造函数声明为私有的A(int a){_a=a;}~A(){delete this;}int _a;};

优化:利用虚继承。

//所以用虚继承来实现,可以在堆上创建对象,也可以在栈上创建对象template <typename T>class C{friend T;  //友元类型private:C(){}~C(){}int _a;};class D:virtual public C<D>    //D是C的友元类型,所以D可以访问C的私有函数,来实现创建对象{public:D(){}  ~D(){}};        //D不能被继承
1.将C的构造和析构函数定义为私有函数,它不能被继承,因为不会提供一个创建对象的接口,所以它不能在类外使用。

2.把D定义成C的友元类型,D就可以调用C的所有函数,包括私有函数,使用D来创建C的对象时,它可以在堆上创建也可以在栈上创建。

3.同时D不能被继承。假设E继承了D,在调用E的构造函数时,会跳过D而直接调用C的构造函数,因为C的构造函数为私有的并且E不是C的友元类型,所以它不能调用C的构造函数。