-
2020-06-14 21:25:50
C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。
一,构造函数
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。 构造原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式 。
构造函数不能为虚:
虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
要成为虚函数必须满足两点,一就是这个函数依赖于对象调用,因为虚函数就是依赖于对象调用,因为虚函数是存在于虚函数表中,有一个虚函数指针指向这个虚表,所以要调用虚函数,必须通过虚函数指针,而虚函数指针是存在于对象中的。二就是这个函数必须可以取地址,因为我们的虚函数表中存放的是虚函数函数入口地址,如果函数不能寻址,就不能成为虚函数。构造函数内联函数不可作为虚函数。
二,析构函数
析构函数也不会被子类继承,只是在子类的析构函数中会调用父类的析构函数。
- 如果没有将基类的析构函数定义为虚函数
当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露
三,赋值运算符重载函数
赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。
更多相关内容 - 如果没有将基类的析构函数定义为虚函数
-
java什么类不能被继承
2021-02-28 12:03:58在java中有一些类并不能被继承,我们可以通过这些不能继承的类设计一些只读的不可变类。Java中不能被继承的类有哪些?在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。这是final的...在java中有一些类并不能被继承,我们可以通过这些不能继承的类设计一些只读的不可变类。Java中不能被继承的类有哪些?
在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。
这是final的规定:当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要
进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final
类中的方法加上一个final,但这显然没有意义。
例如:我们使用的String类,它也是不可被继承的类。
那我们就一起来看看这个问题,首先我们要知道,如果你要判断一个类是否可以被继承的话,你要知道这个类是如何被定义的,所以我们先来看看这个String类是如何被定义的:
以上就是这个String类的定义方式,我们可以明显的看到一个final修饰符!
如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)
-
java中不能继承的类有哪些?
2021-02-12 17:13:35在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户继承时操作有误,很可能引入很多问题。为了防止用户对...在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。
因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户继承时操作有误,很可能引入很多问题。为了防止用户对基本类进行相应的扩展,也体现了java设计过程中的开闭原则,最终将这些类设计成为final的。
这是final的规定:当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要
进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final
类中的方法加上一个final,但这显然没有意义。
java中常见的不能被继承的类有如下:String,
StringBuffer,
StringBuilder,
基本类型的包装类如Double,Integer,Long
等等。
我们来看看这个String类是如何被定义的:
以上就是这个String类的定义方式,我们可以明显的看到一个final修饰符!
如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)
-
C++什么类不能被继承
2020-08-17 21:55:52C++什么类不能被继承 什么类不能被继承,首先思考派生类继承基类将会发生什么默认操作?派生类在调用自身的构造函数之前需要先调用基类的构造函数。那么我们就让这个不想被别人继承的类的构造函数也无法被派生类构造...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 { };
-
类什么情况下不可以被继承
2017-06-14 17:23:111、如果类被final修饰,那么此类不可以被继承。 2、如果类中只有private的构造方法,那么此类不可以被继承。 其原因在于: (1)一个类一定会有构造函数,如果不写,那就是默认的无参构造函数,如果写,就... -
【C# 教程系列第 10 篇】c# 中如何让指定类不能被继承?
2019-01-20 19:06:45有时候我们并不希望自己写的类被继承,怎么做呢? 方法很简单,只需要在定义类时加上 sealed 关键字,用 sealed 关键字声明的类也叫密封类 -
哪些成员函数不能被继承
2019-03-27 21:15:35C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。 1. 构造函数 构造方法用来初始化类的对象,与父类的其它成员... -
Java 类不可被继承的几种方法
2021-06-30 13:27:101.final 修饰符 public final class NoModifer { //没有修饰符 默认为包内可见 ...最常用的,被final 修饰符修饰的类,不可以被继承 2.private 构造方法 package com.xinyu.test.java.Test; public class -
String类为什么不能被继承
2020-03-26 17:34:38我们都知道String类不能被继承,但为什么不能却不能回答地很完整。 首先我们可以看下String的源码(部分): public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ... -
java中被final修饰的类不能被继承
2018-11-05 17:29:23final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的...不变,而且不可被覆盖或改写,就可以采取这种做法。 ... -
如何定义一个不能被继承的类
2016-11-08 21:19:41如何定义一个不能被继承的类??? 假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢??? 方法... -
java抽象类可以被继承吗?
2021-03-06 06:39:35Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。...由于抽象类不能实例化对象,所... -
一直都知道final修饰的类不能被继承,但是不知道为什么不能被继承!
2017-08-09 08:59:09首先你要知道自己为什么要用final,用final干什么! 6.8.2 final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。...这是final的规定当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意 -
Java 继承中子类不能继承父类的所有内容
2020-06-24 10:51:41子类不能继承父类的东西: 子类不能继承父类的构造器:子类有自己的构造器。(没有争议的) 有争议的观点: 子类是否可以继承父类的私有成员(私有成员变量,私有成员方法) ? 答:子类是可以继承父类的私有成员的,只是... -
如何让一个类不能被继承
2015-12-03 11:56:36要想让一个类不能被继承,已知方法有两种。一是,将类的构造函数定义为带private属性。二是,将该类虚继承一个父类,但是该父类的构造函数是带private属性的。 关于第二个方法可行的依据是: 1)派生类不能调用... -
面试题28:不能被继承的类
2017-06-13 22:24:52在Java中同样也有关键字final表示一个类不能被继承。C++11提供final关键字使得类不能够被继承。那么,如何自己实现一个不被继承的类?常规的解法是,把类的构造和析构函数都设置为private即可,然后公有派生;这是... -
C++类体系中,不能被派生类继承的有?
2019-03-05 13:08:56C++类体系中,不能被派生类继承的有? 构造函数不能被继承,但是可以被调用。派生类的构造函数在初始化列表中应调用基类的构造函数。 --------------------- 为什么C++赋值运算符重载函数不能被继承? 这个问题... -
抽象类不能继承接口
2017-09-21 10:21:431. 抽象类可以继承普通类,但不可以继承接口。 (public abstract class 抽象类 extends 普通类 { }) 2. 接口可以继承多接口,但不可以继承抽象类。 (public abstract class 接口1 extends 接口2,接口3 ,接口4{ }... -
java继承关系中,父类private修饰的内容真的不能被继承吗?NO!!
2020-07-18 16:56:40后来随着学习的深入,见得多了一些,看到一些文章博客的另一种观点:其实父类中的东西,除了构造方法之外,其它的全都是可以被继承的,包括私有的。但是由于private修饰的东西,只能在本类中可见。所以即便子类继承... -
jdk中哪些类是不能继承的
2014-02-13 13:22:47不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在jdk中System,String,StringBuffer等都是基本类型。 为什么我继承非fianl修饰的... -
枚举类能继承吗?能被继承吗?
2019-07-19 00:38:25枚举的作用:限定“数据集”中...1.枚举类也是类,也可以有自己的成员变量,成员方法,静态方法、静态变量等,也能实现其他的接口,不能继承其他类了(因为已经继承了java.lang.Enum)。枚举类的对象默认都是public... -
java中私有属性能不能被继承?
2019-11-26 13:22:52java中私有属性能不能被继承? 先来看代码: class Person { private String name = "wanghan"; private void print() { System.out.println("执行的是父类中的方法!"); } public void fun(){ this.... -
理解父类构造方法不能被子类继承
2018-07-07 14:14:27Constructor<? e> constructor = aclass...aclass extends bclass注意:通过实验证明,父类的构造方法 不能被子类继承,例如bclass 有构造方法b(context,viewgroup)aclass没有构造方法a(context,viewg... -
接口能被继承吗?
2021-02-27 10:05:541、接口可以继承接口2、抽象类可以实现接口3、抽象类可以继承实体类注意:接口不能被实体类继承扩展资料:1、Java继承或实现接口时需要遵循的原则:(1)类优先于接口。 如果一个子类继承的父类和接口有相同的方法实现... -
C++中定义一个不能被继承的类
2015-08-31 10:56:16最开始是从构造函数开始着手(先声明这种方法不能定义一个不能被继承的类,这是一种错误的方法,但是很容易往这方面想),假设存在下面的继承体系: 现在假设B是一个不能被继承的类,那么如果存在B的子类C,那么C的... -
【c++】实现一个不能被继承的类
2017-04-20 20:25:13C++如何设计一个类,是该类不能被继承?利用私有构造函数,友元和虚继承的特性来实现 -
不能被继承的类
2012-06-07 11:50:09如何使类不能被继承 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现... -
final修饰的方法能否被继承?能否被重载?能否被重写?final修饰的类能否被继承?
2021-03-24 23:46:51final修饰的类,为最终类,该类不能被继承。如String 类 2. final修饰的方法可以被继承和重载,但不能被重写 3. final修饰的变量不能被修改,是个常量 public class Person { private String name; p -
String被设计成不可变和不能被继承的原因
2017-02-17 22:31:12String是所有语言中最常用的一个类。我们知道在Java中,String是不可变的、final的。... 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final。 一:St -
C++类体系中,不能被派生类继承的
2016-07-21 17:03:05编辑器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全转化为一个基类指针。这样删除一个基类的指针的时候,c++不管这个指针指向一个基类对象还是一个派生类对象,调用的都是基类的析构函数而不是派生...