精华内容
下载资源
问答
  • String 不能被继承原因

    千次阅读 2019-01-24 16:22:57
    String类final修饰不能被继承

    String类被final 修饰不能被继承

     

     

    展开全文
  • C++什么类不能被继承

    千次阅读 2020-08-17 21:55:52
    C++什么类不能被继承 什么类不能被继承,首先思考派生类继承基类将会发生什么默认操作?派生类在调用自身的构造函数之前需要先调用基类的构造函数。那么我们就让这个不想别人继承的类的构造函数也无法派生类构造...

    C++什么类不能被继承

    C++什么类不能被继承,首先思考派生类继承基类将会发生什么默认操作?派生类在调用自身的构造函数之前需要先调用基类的构造函数。那么我们就让这个不想被别人继承的类的构造函数无法被其派生类构造。现在主要有三种方式阻止类的构造函数被调用,一是,将自身的构造函数与析构函数放在private作用域内;二是,将自身作为一个已存在类的友元类。这两种方式都能阻止派生类的继承(因为自身无法构造函数),第三种,使用C++11新特性final。

    一、将自身的构造函数与析构函数放在private作用域

    当本文声明一个对象时,编译器将调用构造函数(如果有),而这个调用将通常是public的,假如构造函数是private呢,由于在class外部不允许访问private成员,所以将会导致编译出错。如何解决这个问题呢?
    我们可以使用class的static公有成员,因为它独立于class对象之外,不必产生对象也可以使用它们。假如在类的某个static函数中创建了该class的对象,并以引用或者指针的形式将其返回(这里不以对象返回,主要是构造函数是私有的,外部不能创建临时对象),使用new在堆上创建对象,这样可以手动的创建和销毁对象,而如果在栈上创建对象,则会在生命周期结束的时候释放掉对象出现不可预估的错误。

    class OnlyHeapClass {
    public:
      static OnlyHeapClass* GetInstance() {
    //创建一个OnlyHeapClass对象并返回其指针
      return (new OnlyHeapClass);
    }
    void Destroy();
    private:
      OnlyHeapClass() {};
      ~OnlyHeapClass() {};
    };
    
    void OnlyHeapClass::Destroy() {
      delete this;
    }
    

    二、将自身作为一个已存在类的友元类

    下面本文要说明不可被继承类的第二种方式。利用友元的特性:友元不能被继承。什么是友元不能被继承性呢?利用了虚继承的一个特征就是虚基类的构造函数由最终子类负责构造。

    class CFinalClassMixin {//从这个类中继承的类都不能再被继承
      friend class Cparent;
    private:
      CFinalClassMixin() {}
      ~CFinalClassMixin(){}
    };
    class Cparent: virtual public CFinalClassMixin, public CXXX {
    public:
      Cparent() {}
      ~Cparent(){}
    };
    class CChild : public Cparent {
    public:
      CChild() {};//编译错误
      ~CChild() {};//编译错误
    };
    

    PS:为什么用虚继承?如果不是虚继承,那么CChild直接调用Cparent的构造函数,这是成立的,而且CChild是不需要调用CFinalClassMixin的构造函数。若把它声明为虚继承,那么CChild就必须负责CFinalClassMixin构造函数的调用,这样又因为不能继承friend类,所以不能调用,造成了错误。
    这里又会出现一个新问题,如果有很多的类不能被继承,那么就需要不断的往CFinalClassMixin中加入友元类。我们可以改进使用模板

    template<class T>
    class CFinalClassMixin {//从这个类中继承的类都不能再被继承
    friend class T;
    private:
      CFinalClassMixin() {}
      ~CFinalClassMixin(){}
    };
    class Cparent: virtual public CFinalClassMixin<Cparent>, public CXXX {
    public:
      Cparent() {}
      ~Cparent(){}
    };
    

    三、C++11的新特性

    直接使用类似JAVA的final的关键字final。

    class FinalClass final {
    
    };
    
    展开全文
  • C++中如何定义不能被继承的类

    千次阅读 2017-06-05 22:47:09
    学习过Java和c#的童鞋应该都知道,在Java中定义了关键字final表示一个类不能被继承,在C#中也有相同意义的关键字sealed表示一个类不能被继承,那仫在C++中呢?是没有这样特殊的关键字了,只能自己实现了。 如何在...

    学习过Java和c#的童鞋应该都知道,在Java中定义了关键字final表示一个类不能被继承,在C#中也有相同意义的关键字sealed表示一个类不能被继承,那仫在C++中呢?在C++11之前是没有的类似这样的关键字的,只能自己实现了。(在C++11中该关键字已经被加入到C++中,这个关键字的作用就是阻止类的进一步派生和虚函数的进一步重载)。
    如何在C++中定义一个不能被继承的类呢?
    想法一:私有构造函数来解决
    我们都知道在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。如果想要一个类无法被继承,那仫这个类的构造函数和析构函数必须是私有的,但是这样又会出现新的问题?就是这个类的构造函数和析构函数是私有的,我们如何获取和删除这个类的实例化对象呢?共有的静态函数就可以解决这个问题。

    class Base
    {
    public:
        //编写静态函数来创建和释放类的实例化
        static Base *GetSpace()
        {
            cout<<"GetSpace()"<<endl;
            return new Base();
        }
        static void DeleteSpace(Base *del)
        {
            cout<<"DeleteSpace()"<<endl;
            delete del;
        }
    private:
        //私有化构造和析构函数
        Base()
        {}
        ~Base()
        {}
    };
    
    int main()
    {
        //静态成员函数没有隐含this指针参数,使用类型::作用域访问符直接调用静态成员函数
        Base *b=Base::GetSpace();
        Base::DeleteSpace(b);
        system("pause");
        return 0;
    }

    私有构造函数和静态成员函数实现不能被继承的类
    这样的实现会不会存在什仫问题呢?通过观察上面的代码我发现实例化一个对象只能使用new来实例,也就是说这个新创建的对象只能在堆上生成,这就存在一定的局限性。那仫如何解决呢?
    想法二:利用虚拟继承的方法
    同样是将父类的构造函数私有化,但是却定义了一个模板类型的友元,因为友元的特性:如果一个类是另一个类的友元,友元类的每个成员函数都是另一个类的友元函数,都可访问另一个类中的保护或私有数据成员。我们在子类中调用父类的构造和析构函数是不会出错的。
    这种想法比方法一的想法好的一点就是:既可以在堆上实例化对象也可以在栈上实例化对象。

    template<typename T>
    class Base
    {
        friend T;  //定义友元,子类可以访问父类的私有成员对象
    private:
        Base()
        {
            cout<<"Base()"<<endl;
        }
        ~Base()
        {
            cout<<"~Base()"<<endl;
        }
    };
    //虚继承
    class Sub:virtual public Base<Sub>  
    {
    public:
        Sub()
        {
            cout<<"Sub()"<<endl;
        }
        ~Sub()
        {
            cout<<"~Sub()"<<endl;
        }
    };
    
    int main()
    {
        Sub s1;   //可以在栈上开辟
        Sub *s2=new Sub; //可以在堆上开辟
        delete s2;
        system("pause");
        return 0;
    }

    虚拟继承
    如果此时对Sub进行继承并对继承Sub的类进行实例化的时候是无法编译通过的。因为Sub是虚拟继承,所以当调用Test的构造函数的时候,会跳过Sub而直接调用Base的构造函数,又因为Base的构造函数是私有的且Test并不是Base的友元所以是不能调用的。
    所以Sub就是满足题意的不能被继承的类。

    class Test:public Sub
    {
    public:
        Test()
        {
            cout<<"Test()"<<endl;
        }
        ~Test()
        {
            cout<<"~Test()"<<endl;
        }
    };

    当然了在C++中定义不能被继承的类有许多其他的方法,在这里我就只介绍这两种啦!!!

    展开全文
  • String类为什么不能被继承

    千次阅读 2020-03-26 17:34:38
    我们都知道String类不能被继承,但为什么不能不能回答地很完整。 首先我们可以看下String的源码(部分): public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ...

    面试的时候我们经常会被问到一个问题,那就是String类能被继承吗?为什么?我们都知道String类不能被继承,但为什么不能却不能回答地很完整。
    首先我们可以看下String的源码(部分):

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0
    
        /** use serialVersionUID from JDK 1.0.2 for interoperability */
        private static final long serialVersionUID = -6849794470754667710L;
        
         public String(char value[], int offset, int count) {
            if (offset < 0) {
                throw new StringIndexOutOfBoundsException(offset);
            }
            if (count <= 0) {
                if (count < 0) {
                    throw new StringIndexOutOfBoundsException(count);
                }
                if (offset <= value.length) {
                    this.value = "".value;
                    return;
                }
            }
            // Note: offset or count might be near -1>>>1.
            if (offset > value.length - count) {
                throw new StringIndexOutOfBoundsException(offset + count);
            }
            this.value = Arrays.copyOfRange(value, offset, offset+count);
        }
    

    从String类的源码我们可以看出,该类是被final关键字修饰的,并且String类实际是一个被final关键字修饰的char[]数组,所以实现细节上也是不允许改变,这就是String类的Immutable(不可变)属性。
    为什么说String类是被final关键字修饰的所以不能被继承?
    在《Java编程思想》中对于final关键字有这样的介绍:

    根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
      final类不能被继承,没有子类,final类中的方法默认是final的。   final方法不能被子类的方法覆盖,但可以被继承。
      final成员变量表示常量,只能被赋值一次,赋值后值不再改变。   final不能用于修饰构造方法。
      注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

    如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
    通过上述介绍,可以发现final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。

    1、当final关键字修饰类时
    当一个类被final修饰时,表明这个类不能被继承。被final关键字修饰的类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
    在这里插入图片描述
    当我们在开发过程中如果让一个类继承一个被final关键字修饰的类时,编辑器也会报错,“Demo1不能成为最终类FinalClass的子类,请移除FinalClass的final关键字”。

    2、当final关键字修饰方法时
    当一个方法被final关键字修饰时,则父类的该方法不能被子类所覆盖。《Java编程思想》中提到:
    使用final方法的原因有两个。
    第一个原因是把方法锁定,以防任何继承类修改它的含义;
    第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。
    同样如果父类中声明了final修饰的方法,则子类在继承该父类是,如果覆盖该final方法编辑器同样会报错。
    在这里插入图片描述
    在这里插入图片描述

    3、当final关键字修饰变量(包括成员变量和局部变量)时
    当final关键字修饰变量时,表示该变量是常量,在初始化时便要赋值并且只能被赋值一次,初始化之后不能更改。。如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是它指向的对象的内容是可变的。
    当用final作用于类的成员变量时,成员变量必须在声明时或者构造器中进行初始化赋值,否则会报错,而局部变量只需要在使用之前被初始化赋值即可:
    在这里插入图片描述

    对于final修饰的变量初始化之后不能更改,如果更改也会报错。
    在这里插入图片描述
    在这里插入图片描述

    其实在问String类能否被继承时,不仅仅考察的是对于String源码的理解,还有对于final关键字的掌握。

    参考资料:
      《Java编程思想》
    在这里插入图片描述

    展开全文
  • java中私有属性能不能被继承

    千次阅读 2019-11-26 13:22:52
    java中私有属性能不能被继承? 先来看代码: class Person { private String name = "wanghan"; private void print() { System.out.println("执行的是父类中的方法!"); } public void fun(){ this....
  • 如何定义一个不能被继承的类

    千次阅读 2016-11-08 21:19:41
    如何定义一个不能被继承的类???  假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢??? 方法...
  • java 注解不能被继承

    千次阅读 2014-04-19 17:46:43
    java 注解不能被继承
  • 不能被继承的类

    千次阅读 2012-06-07 11:50:09
    如何使类不能被继承 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现...
  • c++之哪些成员函数不能被继承

    千次阅读 2020-06-14 21:25:50
    C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。 一,构造函数  构造方法用来初始化类的对象,与父类的其它成员...
  • 构造函数与析构函数不能被继承

    千次阅读 2019-03-04 14:52:00
    构造函数与析构函数不能被继承 不是所有的函数都能自动地从基类继承到派生类中的。 构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。 所以,在整个...
  • 面试题28:不能被继承的类

    千次阅读 2017-06-13 22:24:52
    在Java中同样也有关键字final表示一个类不能被继承。C++11提供final关键字使得类不能够被继承。那么,如何自己实现一个不被继承的类?常规的解法是,把类的构造和析构函数都设置为private即可,然后公有派生;这是...
  • 【c++】实现一个不能被继承的类

    千次阅读 2017-04-20 20:25:13
    C++如何设计一个类,是该类不能被继承?利用私有构造函数,友元和虚继承的特性来实现
  • Java中不能被继承的类

    千次阅读 2016-12-12 21:04:06
    //java.lang包中不能被继承的类: public final class Byte public final class Character public static final class Character.UnicodeBlock public final class Class public final class Compile public final ...
  • 如何让一个类不能被继承

    千次阅读 2015-12-03 11:56:36
    要想让一个类不能被继承,已知方法有两种。一是,将类的构造函数定义为带private属性。二是,将该类虚继承一个父类,但是该父类的构造函数是带private属性的。 关于第二个方法可行的依据是: 1)派生类不能调用...
  • springboot结合redis使用CachingConfigurerSupport方法不能被继承
  • 不能被继承的类(模板参数友元) 代码(C++)本文地址:http://blog.csdn.net/caroline_wendy题目: 用C++设计一个不能被继承的类.可以使用模板类模板参数友元, 模板类私有构造函数, 类虚继承这个模板类, 如果类其他类...
  • String不能被继承

    千次阅读 2007-11-12 21:48:00
    String是一个类,而...String不能被继承,因为它是final的。 String的完整签名是public final class Stringextends Objectimplements Serializable, ComparableString>, CharSequence原文来源:https://docs.google.
  • 用c++设计一个不能被继承的类

    千次阅读 2017-08-02 12:16:42
    在Java 中定义了关键字final ,final 修饰的类不能被继承。但在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。 首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类...
  • 哪些成员函数不能被继承

    千次阅读 2019-03-27 21:15:35
    C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。 1. 构造函数  构造方法用来初始化类的对象,与父类的其它成员...
  • C++中定义一个不能被继承的类

    千次阅读 多人点赞 2015-08-31 10:56:16
    最开始是从构造函数开始着手(先声明这种方法不能定义一个不能被继承的类,这是一种错误的方法,但是很容易往这方面想),假设存在下面的继承体系: 现在假设B是一个不能被继承的类,那么如果存在B的子类C,那么C的...
  • 不能被继承的类(私有构造函数) 代码(C++)本文地址:http://blog.csdn.net/caroline_wendy题目: 用C++设计一个不能被继承的类.可以使用私有构造函数, 并提供静态成员函数, 返回和删除类的实例.则只能在堆上创建实例, ...
  • C++定义不能被继承的类

    千次阅读 2012-12-22 12:51:26
    C++的定义的类要求不能被继承,貌似最简单的想法是将构造函数定义为私有的,但事实上这样并不对,这会引发一个问题,用户如何实例化该类?因为友元关系是不能够被继承的,所以可以考虑友元+私有化构造函数来实现。 ...
  • String是所有语言中最常用的一个类。我们知道在Java中,String是可变的、final的。... 若 String 允许被继承, 由于它的高度使用率, 可能会降低程序的性能,所以 String 定义成 final。   一:St
  • 首先你要知道自己为什么要用final,用final干什么! 6.8.2 final方法 ...不变,而且覆盖或改写,就可以采取这种做法。这是final的规定当你将final用于类身上时,一个final类是无法任何人继承的,那也就意
  • 用C++实现一个不能被继承的类

    千次阅读 2012-10-03 12:48:47
    题目:用C++设计一个不能被继承的类  不能被继承不能被继承?按照继承的理论知识分析,我们只要把类的构造函数设置为私有的,即可解决问题。因为那样的话,子类就没有办法访问基类的构造函数,从而就阻止了进行...
  • 不能继承,继承会发生什么,继承的类在创建对象的时候,会自动调用父类的构造函数,如果我们在这里限制让子类不能调用父类的构造和析构就是实现了不能继承,但是也不能影响自己的使用。 方案一:思想:设置构造函数...
  • 用C++设计一个不能被继承的类

    千次阅读 2011-06-17 11:05:00
    在C#中定义了关键字sealed,sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。  很多人都能够想到,类的构造...
  • 有时候我们并希望自己写的类被继承,怎么做呢? 方法很简单,只需要在定义类时加上 sealed 关键字,用 sealed 关键字声明的类也叫密封类
  • 如何创建一个不能被继承的类

    千次阅读 2012-09-11 15:05:09
    在C#中,有sealed关键字表明这个类不能被继承。但是C++中没有这个关键字,所以想达到这样的目的还是得费点功夫。 先看程序吧: class Uninheritable { friend Base; private: Uninheritable(){} }; class ...
  • java中final修饰的类不能被继承

    千次阅读 2018-11-05 17:29:23
    final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的...不变,而且覆盖或改写,就可以采取这种做法。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,420,318
精华内容 568,127
关键字:

不能被继承