抽象类

C++纯虚函数和抽象类

蓝咒 提交于 2020-02-16 22:03:05
  在C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 =0 ,表明此函数为纯虚函数。最后的 =0 并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。 包含纯虚函数的类称为抽象类(Abstract Class) 。之所以说它抽象,是因为它无法实例化,即无法创建对象。因为纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。   抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。派生类可以只实现抽象基类中的某一个纯虚函数,此时该派生类对象还不能实例化(该派生类仍是抽象类),必须是所有纯虚函数都在派生类中实现才可以实例化。   抽象基类不需要被实例化,但是它为派生类提供了“约束条件”,派生类必须要实现抽象基类中的纯虚函数,完成对应的功能,否则就不能实例化。抽象基类除了约束派生类的功能,还可以实现多态。   一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数。如下: 1 //顶层函数不能被声明为纯虚函数 2 void fun() = 0; /

面向对象

僤鯓⒐⒋嵵緔 提交于 2020-02-16 16:31:18
面向对象 封装 一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法 封装的优点 良好的封装能够减少耦合 类内部的结构可以自由修改 可以对成员变量进行更精确的控制 隐藏信息,实现细节 实现方式:属性私有+ setter()/getter() 继承 子类继承父类的特征和行为,继承是面向对象的基石 java 不支持多继承,实现接口可视为弱继承 非私有、静态的属性和方法属于类,不能被继承,但能用子类名访问 非私有、非静态的属性和方法可以被继承 父类的私有属性 子类具有拥有权,但是不具有使用权 可以使用父类继承来的 setter/getter 方法,访问该属性 构造方法不能被继承,在继承中 父类没有定义构造方法或定义了无参数的构造方法,子类不须要定义构造方法 父类只有带参数的构造方法时,子类也不能有无参构造,必须定义带参构造,且要在第一行通过 super 显式调用父类构造方法 final 修饰的成员 final 修饰的属性可以被继承 final 修饰的方法可以被继承,不能被重写 分析内存后发现,当一个子类被实例化的时候,默认会先调用父类的构造方法对父类进行初始化,即在内存中创建一个父类对象,然后在父类对象的外部放上子类独有的属性,两者合起来成为一个子类的对象 所以,子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法是对的,只不过父类的私有属性和方法,子类是无法直接访到的,这也是

scala的抽象类

痴心易碎 提交于 2020-02-16 09:55:34
抽象类 和Java语言一样,scala中也可以定义抽象类 定义 如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类 不完整定义有两种情况: 方法没有方法体(抽象方法) 变量没有初始化(抽象字段) 定义抽象类和Java一样,在类前面加上abstract关键字 // 定义抽象类 abstract class 抽象类名 { // 定义抽象字段 val 抽象字段名:类型 // 定义抽象方法 def 方法名(参数:参数类型,参数:参数类型…):返回类型 } 抽象方法 示例 设计4个类,表示上述图中的继承关系 每一个形状都有自己求面积的方法,但是不同的形状计算面积的方法不同 步骤 创建一个Shape抽象类,添加一个area抽象方法,用于计算面积 创建一个Square正方形类,继承自Shape,它有一个边长的主构造器,并实现计算面积方法 创建一个长方形类,继承自Shape,它有一个长、宽的主构造器,实现计算面积方法 创建一个圆形类,继承自Shape,它有一个半径的主构造器,并实现计算面积方法 编写main方法,分别创建正方形、长方形、圆形对象,并打印它们的面积 参考代码 // 创建形状抽象类 abstract class Shape { def area:Double } // 创建正方形类 class Square ( var edge:Double /*边长*/ )

C++多态

青春壹個敷衍的年華 提交于 2020-02-16 09:51:28
1概念 多态 :不同类型对象调用相同接口完成不同的行为。 1.1覆盖(重写override)成立的三个条件 1.继承 2.子类覆盖(重写)父类虚函数 3.父类指针/引用指向子类 1.2虚函数定义规则: 如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,有无const. 那么 即使加上了virtual关键字,也是不会覆盖。 只有 类的成员函数才能说明为虚函数 ,因为虚函数 仅适合 用与有继承关系的类对象,所以普通函数不能说明为虚函数。 静态成员函数不能是虚函数 ,因为静态成员函数的特点是不受限制于某个对象。 内联(inline)函数不能是虚函数 ,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。 构造函数不能是虚函数 ,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 析构函数可以是虚函数 ,而且通常声明为虚函数。 1.3多态的实现原理分析 当类中声明虚函数时,编译器会在类中生成一个 虚函数表(基类和派生类中各自都会生成一个) 1.4虚函数表 虚函数表是一个 存储类成员函数指针 的数据结构 虚函数表是由 编译器自动生成和维护 的 virtual函数会被 编译器 放入虚函数表中 存在虚函数时,每个对象当中都有一个 指向虚函数表的指针 (vptr指针) 1

Java面试题-基础篇二

会有一股神秘感。 提交于 2020-02-16 07:58:06
11、是否可以从一个static方法内部发出对非static方法的调用? 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。 12、Integer与int的区别 int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。 例如:要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。 在Hibernate中,如果将OID定义为Integer类型

Scala基础(6) 单例对象和伴生对象

我怕爱的太早我们不能终老 提交于 2020-02-16 00:13:13
单例对象 Scala并没有提供Java那样的静态方法或者静态字段,但是,可以采用object关键字实现单例对象,具备和Java静态方法同样的功能。 ⚠️注意:在Scala中需要对值进行返回可以使用:1. return value;2. 直接写在方法的最后面一行。 object Person{ private var lastId = 0 def newPersonId()={ lastId += 1 lastId } } printf("first person id is %d.\n", Person.newPersonId()) printf("second person id is %d.\n", Person.newPersonId()) printf("third person id is %d.\n", Person.newPersonId()) // 我没有运行起来 出现在object中的变量和方法都是静态的,也就是多次调用原数据不会被清零。 伴生对象 Scala源代码编译后都会变成JVM字节码。实际上,在编译上面的源代码文件以后在Scala里面的class和object在Java层面都会被合二为一,class里面的成员成了实例成员,object成员成了static成员。 应用程序对象 每一个Scala应用程序都必须从一个对象的main方法开始。 object

多态

醉酒当歌 提交于 2020-02-15 20:22:19
多态 什么是多态? 概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 简单的说:就是用基类的引用指向子类的对象。 举个例子: 电脑上的 F1 按键,当不打开任何文件点击 F! 显示的是系统的帮助文档,当打开 word 文档点击 F1 显示的是 word 文档的帮助,同一个按钮但是能实现不同的处理方式。 为什么要用多态? 我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。 而多态除了代码的复用性外,还可以解决项目中紧偶合的问题 , 提高程序的可扩展性 . 。 如果项目耦合度很高的情况下,维护代码时修改一个地方会牵连到很多地方,会无休止的增加开发成本,降低耦合度可以保证程序的拓展性。 可替换性( substitutability )。多态对已存在代码具有可替换性。例如,多态对圆 Circle 类工作,对其他任何圆形几何体,如圆环,也同样工作。 可扩充性( extensibility )。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。 开发中在什么地方用多态,怎么实现的多态? 接口实现、抽象类、继承父类进行方法重写

java中抽象类和接口类区别

邮差的信 提交于 2020-02-15 12:46:57
相同点: ①二者都不能实例化,即都不能new对象,只能通过子类定义使用; ②一个类如果继承了某个抽象类或者实现了接口,都需要对里面的抽象方法全部进行实现,否则还需被声明为抽象类; ③运行时多态。 不同点: 来源: CSDN 作者: weixin_43973521 链接: https://blog.csdn.net/weixin_43973521/article/details/104307543

Java 接口小总结;

蓝咒 提交于 2020-02-15 07:47:07
1.四种基本访问修饰 访问修饰符: 控制访问权限 public 公共的 在不同的包,自己的包都可以使用; default默认的 只能在自己的包中使用; protected 受保护的 不能修饰类 只能在自己的包中使用或者在其他包的子类中使用; private 私有的 不能修饰类 只能在自己的包中自己的类中使用; 2.接口小总结: 将抽象类进行更彻底就是接口,在接口中,所有的方法都是抽象的方法,所有的方法都不提供具体的实现的(比抽象类更抽象的类); 创建接口(在同一个包中,接口名也不能和类文件名相同); 类:class 类名 接口: interface 接口名 interface接口也是一种引用类型 类接受接口的关键字 implements 接口 1.接口可以有任意数量的方法; 2.接口不能被实例化; 3.接口不包含任何构造器; 4.接口的所有的方法都是抽象的; 5.接口中不能包含实例成员变量,唯一可以出现在接口中的成员变量必须是同事声明为static和final; 6.接口不能被一个类继承,只能被一个类实现; 7.一个接口可以继承多个接口。 接口性质 1.接口默认是抽象。在声明接口时,不需要使用关键字abstract; 2.接口中的每一个方法默认的也是抽象的,所以也不需要关键字abstract; 3.接口中的方法默认访问级别是public。在编写接口的时候通常用public关键字

Java 中的封装、继承与多态

与世无争的帅哥 提交于 2020-02-15 05:50:12
在前面的 《 Java — 面向对象的编程语言》 里,介绍了面向对象的三大特征:封装、继承、多态,主要是概念上的讲解,本篇文章将从代码出发,看看 Java 中的封装、继承与多态。 一、封装 在编程时,把数据(属性)和有关属性的一些操作(方法)绑定在一起,形成一个不可分开的集合(类),这个过程就是封装( Encapsulation )。 封装时,我们需要隐藏对象的属性和实现细节,仅对外公开接口,并控制在程序中属性的读和写的 访问级别 。 一般情况下,我们会把所有的属性都 私有化 ,对每个属性提供 getter (读) 和 setter (写) 方法,供外界使用: public class Person { private String name ; private int age ; public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } public int getAge ( ) { return age ; } public void setAge ( int age ) { this . age = age ; } } public class Me { public static void main ( String [ ]