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{
    };
  • 相关阅读:
    MISRA C:2012 8 Rules 8.1 A Standard C environment
    《程序设计与算法(二)算法基础》《第二周 递归》爬楼梯 4017
    关于extern "C"(详细剖析)
    Github与TortoiseGit关联
    《程序设计与算法(二)算法基础》《第二周 递归》四则运算表达式求值 4132
    c语言 宏
    MISRA C:2012 Dir-1.1(Required)
    《程序设计与算法(二)算法基础》《第二周 递归》逆波兰表达式
    cogs1619. [HEOI2012]采花 x
    cogs157. [USACO Nov07] 奶牛跨栏 x
  • 原文地址:https://www.cnblogs.com/yplhh/p/4636184.html
Copyright © 2011-2022 走看看