精华内容
下载资源
问答
  • C++什么不能被继承

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

    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++之哪些成员函数不能被继承

    千次阅读 2020-06-14 21:25:50
    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统...

    C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。

    一,构造函数   

    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。   如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。 构造原则如下:

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

    6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式 。

    构造函数不能为虚:

    虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数

    要成为虚函数必须满足两点,一就是这个函数依赖于对象调用,因为虚函数就是依赖于对象调用,因为虚函数是存在于虚函数表中,有一个虚函数指针指向这个虚表,所以要调用虚函数,必须通过虚函数指针,而虚函数指针是存在于对象中的。二就是这个函数必须可以取地址,因为我们的虚函数表中存放的是虚函数函数入口地址,如果函数不能寻址,就不能成为虚函数。构造函数内联函数不可作为虚函数。

    二,析构函数   

    析构函数也不会被子类继承,只是在子类的析构函数中会调用父类的析构函数。

    • 如果没有将基类的析构函数定义为虚函数
      当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露

    三,赋值运算符重载函数   

    赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。

    展开全文
  • final修饰的能否被继承? 首先我们先看下final在java中的作用 final在Java中可以用来修饰、修饰方法和修饰变量 1. final修饰的,为最终,该不能被继承。如String 2. final修饰的方法可以被继承和...

    final修饰的方法能否被继承?能否被重载?能否被重写?final修饰的类能否被继承?

    首先我们先看下final在java中的作用
    final在Java中可以用来修饰类、修饰方法和修饰变量

     1. final修饰的类,为最终类,该类不能被继承。如String 类
        
     2. final修饰的方法可以被继承和重载,但不能被重写
            
     3. final修饰的变量不能被修改,是个常量
    
    
    public class Person {
    
        private String name;
        private int age;
        private String sex;
    
        final public void work(){ //final 修饰的最终方法 可以被子类继承,但不能被重写
            System.out.println("a person can do work");
        }
    
        final public void work(int age){ //重载一个final类
            System.out.println("a person can do another work");
        }
    
        public void eat(){   //普通方法  可以被子类继承、重写
            System.out.println("a person need to eat");
        }
    
        public static void sleep(){  //静态方法  可以被继承
            System.out.println("a person need to sleep");
        }
    }
    
    

    子类继承了父类Person 重写了父类普通方法eat() ,但不能重写父类final修饰的方法和静态方法

    public class Man extends Person{
        
        public void eat(){
            System.out.println("the man also need do eat");
        }
    
        public static void sleep(){
            System.out.println("the man also need to sleep");
        }
    
    }
    
    
    展开全文
  • 什么情况下不可以被继承

    万次阅读 2017-06-14 17:23:11
    1、如果类被final修饰,那么此类不可以被继承。 2、如果中只有private的构造方法,那么此类不可以被继承。  其原因在于:  (1)一个一定会有构造函数,如果不写,那就是默认的无参构造函数,如果写,就...

    1、如果类被final修饰,那么此类不可以被继承。

    2、如果类中只有private的构造方法,那么此类不可以被继承。

         其原因在于:

         (1)一个类一定会有构造函数,如果不写,那就是默认的无参构造函数,如果写,就只有所写的构造函数。

          (2)子类的构造函数一定会调用父类的构造函数,但是如果父类中只有私有的构造方法,那么子类就无法调用父类,就会有问题。

    展开全文
  • 哪些类继承了Collection接口

    千次阅读 2019-08-14 17:30:18
    1、Collection接口...2、 Set接口Set接口继承于Collection接口,它没有提供额外的方法,但实现了Set接口的集合中的元素是无序且不可重复。特征:无序且不可重复。 3、 List接口List接口同样也继承于Colle...
  • Java--String能否被继承

    千次阅读 2018-05-30 11:04:32
    String能否被继承呢?答案是不能的 String的方法头是:Public final class String extends Object 之所以不能被继承就是因为其中的修饰关键字 final 其含义相当于C/C++的const,意味着不可修改。 final可以...
  • C++继承(1) - 基类哪些数据会被子类继承下来
  • 枚举继承吗?能被继承吗?

    千次阅读 2019-07-19 00:38:25
    枚举的作用:限定“数据集”中...1.枚举也是,也可以有自己的成员变量,成员方法,静态方法、静态变量等,也能实现其他的接口,不能继承其他了(因为已经继承了java.lang.Enum)。枚举的对象默认都是public...
  • String为什么不能被继承

    千次阅读 2020-03-26 17:34:38
    面试的时候我们经常会问到一个问题,那就是String被继承吗?为什么?我们都知道String不能被继承,但为什么不能却不能回答地很完整。 首先我们可以看下String的源码(部分): public final class String ...
  • String被继承吗,为什么。

    千次阅读 2018-09-06 13:27:54
    String 是不能被继承的,因为他是final关键字修饰的。 public final class String implements java.io.Serializable, Comparable&lt;String&gt;, CharSequence { /** The value is used for ...
  • JDK15一共有14个新特性,其中最为笔者印象深刻的莫过于对于——密封类可以被继承 密封从刚开始学就从各种途径了解到不能被继承,新版本的密封如果想要被继承需要用permits指定被继承 同时,被继承需要用...
  • c++如何防止一个类其他类继承

    千次阅读 2017-07-25 23:44:56
    如何在防止一个类其他的类继承呢?如果是仅仅为了达到这个目的可以直接把这个类的构造函数设置成私有的,这样就杜绝了其他类的继承。也相当于毁掉了这个类(无法再创造出自己的对象)。 那么怎么样既要保证这个类...
  • 有时候我们并不希望自己写的类被继承,怎么做呢? 方法很简单,只需要在定义时加上 sealed 关键字,用 sealed 关键字声明的也叫密封
  • CSS有哪些属性可以继承

    千次阅读 2019-06-03 19:30:09
    这里是修真院前端小课堂...【CSS有哪些属性可以继承? 】 1.背景介绍 了解css样式表的继承,我们先从文档树(HTML DOM)开始,文档树由HTML元素组成,文档树和家族树类似,也有祖先、后代、父亲、孩子、兄弟 ...
  • 哪些成员函数不能被继承

    千次阅读 2019-03-27 21:15:35
    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统...
  • 先给出答案:可以被子类继承,不能被子类重写。 关于父类和子类关系还不太了解的看一去看一下链接https://blog.csdn.net/qq_34826261/article/details/97635047,里面详细解释了父类和子类不同情况下成员方法和成员...
  • 1、接口可以继承接口,抽象可以继承接口,但可以实现接口。 2、抽象类可以继承实体。抽象类可以实现(implements)接口,抽象是否可继承实体,但前提是实体必须有明确的构造函数。 3.抽象类可以继承实体...
  • Java 继承

    千次阅读 多人点赞 2019-05-07 11:12:43
    继承是从已有的中派生出新的,新的能吸收已有的数据属性和行为, 并能扩展新的能力, 继承使用的是extends 继承格式 class 父类 { } class 子类 extends 父类 { } 继承的优点: 1 提高了代码的...
  • Python中,一个类可以通过继承的方式来获得父类中的非私有属性和非私有方法。 一、继承、重写、和调用重写的父类方法 继承的语法为在类名后的小括号()中写入要继承的父类名,如果要继承多个则中间用逗号分隔。 ...
  • java中final修饰的不能被继承

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

    万次阅读 多人点赞 2016-03-31 12:49:16
    不能被继承
  • java中私有方法是否可以被继承

    千次阅读 2020-07-28 17:43:00
    很多小伙伴都认为父类的私有成员在子类中访问不到,所以误认为父类中的私有成员是不可以被继承的。今天遇到了同样的问题,特意花了点时间研究了一下。下面请看源码 首先定义一个父类,父类中提供一个私有属性a和私有...
  • 而一个个去找又太浪费时间,好在这些问题找就解决了,有两个方法可以查看当前所关联或是继承的关系。 Ctrl+Alt+H 查看当前哪些地方被继承。 ctrl+shift+g 查看当前哪些地方引用。...
  • java写一个Person类,包含name、age、sex属性,再写一个Student类继承Person类,增加School属性,并实例化。(用构造方法实现,并使用super())
  • 但是一个派生的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生的对象,调用的都是基类的析构函数而不是派生的。如果你依赖于派生的析构...
  • 可以继承其他,但不能用extends。 可以实现某接口,但不能用implements。匿名内部,就是没有名字的内部。故没有构造器,必须调用基类的构造器。所以是继承基类的。匿名内部经常用来覆盖基类的某些方法:...
  • 在继承关系中,子类可以继承父类的public 属性和方法,可以继承protected属性和方法,如果子类和父类在同一个包中,则父类默认访问修饰符属性和方法也是可以被子类继承的。父类的构造函数不能继承 访问修饰符 ...
  • 而抽象在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象的一个典型应用,假设某个项目的所有Servlet都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个...
  • 一个类可以只能继承一个抽象,为什么接口可以继承接口。谢谢大神帮我回答

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,026,150
精华内容 810,460
关键字:

哪些类可以被继承