zoukankan      html  css  js  c++  java
  • 如何产生一个不能被继承的类

      对于这个问题,我首先想到的是将“父类”的构造函数声明为私有的,这样的话,子类就不能在自己的构造函数中调用父类的构造函数(就算没有显示调用父类的构造函数,编译器也会自动在子类的构造函数中插入调用父类构造函数的代码),于是就实现了不能被继承的类。同时,我们还是要能够产生这个类的对象,所有要公开一个方法,在该方法中调用私有构造函数。这种解法有点像Singleton。

    class CNoChildren{
    public:
        CNoChildren* createCNoChildren(){
            CNoChildren* obj = new CNoChildren();
            return obj;
        }
    private:
        CNoChildren(){}
    };

      但是,上面的代码又是有问题的,因为要调用createCNoChildren()函数,我们必须有个对象,然而构造函数是私有的,那么该如何实例化呢?----只需把方法改为静态的就行。

    class CNoChildren{
    public:
        static CNoChildren* createCNoChildren(){
            CNoChildren* obj = new CNoChildren();
            return obj;
        }
    private:
        CNoChildren(){}
    };
       对于上面那种方法,当我们需要一个对象的时候需要使用类中的一个静态方法。那么,是否有办法能够使用new来创建一个不能被继承的类的对象呢?这个我也没想出来,后来在网上发现有个很巧妙的方法,这里分享一下。
     
        想想增加一层抽象性、友元和虚继承。我们把类A的构造函数声明为私有的,然后让类B继承类A,类B的构造函数是public的。然后B就可以直接new出一个对象,为了在B的构造函数中能够调用A的私有的构造,我们把类B声明为类A的友元。
    class A{
    friend class B;
    private:
        A(){}
    };
    
    class B:public A{
    };

      但是,现在B又可以被其他类继承!!现在考虑一下虚继承。让B虚继承于A,根据虚继承的特性,如果一个类C继承B,那么C需要调用A的构造函数,但是C不是A的友元,不能调用A私有的构造函数。

    class A{
    friend class B;
    private:
        A(){}
    };
    
    class B:virtual public A{
    };
  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/yplhh/p/4636184.html
Copyright © 2011-2022 走看看