首先,不能被继承的类,也就是它的子类继承它后不能正常的实例化。其实,如果能考虑到这里,就很简单了:子类需要实例化父类,将父类的构造函数设为private,子类就无法实例化了。再进一步,子类的析构函数需要调用父类的析构函数,所以将父类的析构函数设为private也能解决我们的问题。

但是如果将父类的构造函数设为private,它自己就无法正常,它自己的对象没法正常的声明、实例化。将构造函数设为了private非常的像单例模式,促使我们想通过friend函数解决无法实例化的问题。

一切难题都可以通过增加一个中间层去解决:

要正常的使用该类,它的构造函数和析构函数必然是public访问权限。我们为它增加一个虚继承的父类,它是父类的friend(友元),父类的构造函数是private。

class A;

class final
{
    friend class A;
    final(){}
};

class A : virtual public final
{
    public:
        A(){}
};

class B : public A
{
    public:
        B(){}
};

class A 是final的friend,所以A可以调用final的构造函数。

因为A虚继承了final,往后所有继承A的子类,都必须自己实例化final,以保证final在对象中的唯一性。

所以,B继承A后,需要自己调用虚继承的父类final的构造函数。显然,B不是final的友元,不能访问private中的构造函数。