多态

twelve day("多态","抽象类","接口")

断了今生、忘了曾经 提交于 2020-01-11 23:03:35
多态 多态就是一个对象的多种形态 //父类引用子类对象 Aniaml a = new Dog ( ) ; //特点 //1,不能使用子类特有的方法 //2,调用方法时,编译看左边,运行看右边 好处: 可以让我们面向父类,操作所有的子类共性的内容 提升了程序的扩展性 多态的转型 //向下转型其实就是父类引用子类对象 Aniaml a = new Dog ( ) ; //向上转型是为了能够使用子类特有的内容 //与强制类型转换的格式一样 Dog d = ( Dog ) a ; //转型异常:ClassCastException //为了解决这个异常,提供了关键字: instanceof //通过instanceof关键字,可以判断要转的类型是否符合当前类型 boolean 结果 = 多态变量名 instanceof 类名; //转型仅仅是对象的形态发生了变化,对象的地址并没有变化 抽象类 抽象方法和抽象类要使用abstract关键字来修饰 抽象方法:没有方法体的方法就是抽象方法 当无法确认方法体的具体内容时,可以使用抽象方法 抽象类:含有抽象方法的类一定是抽象类 //抽象类格式: public abstract class 类名 { } //抽象方法格式: public abstract 返回值类型 方法名(参数列表) ; 特点 1:抽象类不能直接创建对象;(语法规定) 2:抽象类中

C++虚函数内存对象模型

余生长醉 提交于 2020-01-11 02:02:46
文章目录 C++虚函数内存对象模型 1. 简单继承 2. 简单继承后子类新增虚函数 3. 继承的虚函数并非最初子类 4. 多继承 5. 总结 C++虚函数内存对象模型 面向对象的精彩都是通过多态引起的,通过多态,我们可以完成抽象和封装,并且做到针对抽象编程,给项目的扩展带来了很多的便利。 在C++中多态的实现有两种方式: 重载。 继承。 重载其实并不能算作完美的面向对象的多态,继承才是。我们知道继承的多态主要依赖虚函数来实现,那么C++底层是如何实现虚函数的呢?本文来深度探索一下C++基于虚函数的多态对象模型。 1. 简单继承 在这个场景我们来看一下一个最简单的继承关系: 代码实现如下 class CLevel1 { public : CLevel1 ( ) { } virtual ~ CLevel1 ( ) { } virtual void Fun1 ( ) { std :: cout << "CLevel1 Fun1" << std :: endl ; } private : int m_Data1 = 100 ; } ; class CLevel2 : public CLevel1 { public : CLevel2 ( ) { } virtual ~ CLevel2 ( ) { } virtual void Fun1 ( ) override { std :: cout

Java面向对象之多态

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-10 21:08:01
多态 多态是继封装、继承之后,面向对象的第三大特性。 生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。 定义 多态 : 是指同一行为,对于不同的对象具有多个不同表现形式。 程序中多态: 是指同一方法,对于不同的对象具有不同的实现. 前提【重点】 继承或者实现【二选一】 父类引用指向子类对象【格式体现】 方法的重写【意义体现:不重写,无意义】 知识点-- 实现多态 讲解: 多态体现的格式: 父类类型 变量名 = new 子类对象; 变量名 . 方法名 ( ) ; 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。 代码如下: Fu f = new Zi ( ) ; f . method ( ) ; 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。 代码如下: 定义父类: public abstract class Animal { public abstract void eat ( ) ; } 定义子类: class Cat extends Animal { public void eat ( ) { System . out . println ( "吃鱼" ) ;

学习第九天

匆匆过客 提交于 2020-01-10 14:09:19
一: Object类 老祖宗类 是java所有类的父类 java中的所有类都会直接或者间接的继承自Object类 因为java单继承机制,如果一个类有显示的继承其他类,如果没有显示继承,会默认继承自Ojbect类 常用的方法: 1) toString() 把对象以字符串的形式显示 当打印一个对象的引用时候,会先调用对象的toString()方法,打印的是方法的返回值 当打印对象引用时候,默认调用toString()方法,而Object类中的toString()会打印对象的地址,如果想要打印对象的信息(所有成员属性的值),需要在子类中重写toString()方法 二: java中的面向对象三大特性之一的多态: 多态:一种事物的多种形态|多种表现形式 多态的表现形式: 父类的引用(直接父类|间接父类)指向子类的对象 多态的前提: 类的继承|接口的实现 多态的使用特点: 多态引用调用的时候,会调用子类中重写的方法,如果没有重写,会调用父类的内容 多态调用时,会子类新增内容不可见 多态调用类中成员的特点: 成员变量 编译运行看父类|左边|类型 成员方法 编译看父类|左边|类型,运行看子类|右边|对象 三: 转型: 孔子装爹: class 孔子爹{void teach(){讲做生意…}} class 孔子 extends 孔子爹{void teach(){讲论语…}; void play()

NSFX手册的学习(1)

拥有回忆 提交于 2020-01-10 12:22:43
(边学手册边学C++) 组件的行为由组件所提供和使用的接口决定。组件通过一系列 的接口 来实现其函数功能的。目标模型的根接口是IObject。每一个接口一定直接或间接地从IObject衍生出来。每一个组件都一定会应用到IObject。 我们来看下面这个例子: class IObject { public: virtual ~IObject(void) BOOST_NOEXCEPT {} virtual refcount_t AddRef(void) = 0; virtual refcount_t Release(void) = 0; virtual void* QueryInterface(const Uid& iid) = 0; };IObject这个类定义了四个虚函数。---------------我们来看一下关于虚函数的知识:*虚函数是为了实现多态性的。*基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。为了让基类指针能够访问派生类的成员函数,c++增加了虚函数。使用虚函数非常简单,只需要在函数声明前面增加virtual关键字。*有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。*换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式

多态之虚方法实现

北城以北 提交于 2020-01-10 10:17:19
多态之虚方法步骤 1)将父类的方法标记为虚方法,使用关键词virtual,这个函数可以被子类重新写一遍,override将子类标记; using System ; using System . Collections . Generic ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; namespace _01多态 //实现多态的三种方法:抽象类、虚方法、接口 { class Program { static void Main ( string [ ] args ) { //概念:让一个对象能够表现多重的状态(类型) Chinese chinese = new Chinese ( "刘德华" ) ; Japanese japanese = new Japanese ( "苍井空" ) ; Korea korea = new Korea ( "金秀贤" ) ; Person [ ] pers = new Person [ 3 ] { chinese , japanese , korea } ; for ( int i = 0 ; i < pers . Length ; i ++ ) { pers [ i ] . SayHello ( ) ; //输出全是我是人类 //

Java 多态

拈花ヽ惹草 提交于 2020-01-10 04:48:42
Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现。 现实中,比如我们按下 F1 键这个动作: 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档; 如果当前在 Word 下弹出的就是 Word 帮助; 在 Windows 下弹出的就是 Windows 帮助和支持。 同一个事件发生在不同的对象上会产生不同的结果。 多态的优点 1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 多态: * 1.编译时多态:一个接口(方法),多种实现(方法的重载) * 2.运行时多态:父类可以接收子类对象 * * 多态的作用:屏蔽子类差异化,写出通用的代码 * 运行时多态的前提是建立在继承的基础之上! public class Main { public static class Bird { public void fly() { System.out.println("飞扬的小鸟"); } } public static class Chicken extends Bird{ public void fly() { System.out.println("一只性感的小鸡

面向对象的三个基本特征

被刻印的时光 ゝ 提交于 2020-01-10 03:52:38
面向对象的三个基本特征是: 封装、继承、多态 1. 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2. 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力; Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承

类的封装,多态,内置函数

本秂侑毒 提交于 2020-01-10 03:16:35
1.多态 2.封装:   1.封装属性   2.封装方法   3.封装的原理   4.封装存在的问题   5.计算属性 3.类中内置函数 1.多态 多态是一种概念,指的是某种事物具备多个不同形态 例如 水:气态,固态,液态    动物:猫,狗,猪 OOP 中,标准解释:多个不同类型对象 可以响应同一个方法 并且产生不同结果 多态的好处:   只需要学习基类中的使用方法即可,不需要关心具体的哪一类,以及实现的,以不变应万变,提高了扩展性 案例: 2.封装 什么是封装:   对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:   封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:   就是为了能够限制外界对内部数据的访问 python中属性的权限分为两种:   1.公开的:没有任何限制,谁都可以访问   2.私有的:只有当前类本身能够访问 默认为公共的 如何封装:    在类内定义的属性前加 __ 开头的方法 为什么要封装:   1.提高安全性: 封装属性   2.隔离复杂度: 封装方法 一个类中分为两种数据:-->属性和方法 封装的原理:   python 是通过 <变形> 的方式来是实现封装的   如何变形: 在名称带有双下划线开头的变量名字前添加_类名, 如:_Person_id_card   通过变形后的名字可以直接访问被隐藏的属性,但通常不应该这么做

继承和多态

倖福魔咒の 提交于 2020-01-10 02:44:46
1.C#中不允许多重继承 基类----派生类 (只能一个,此派生类不能再作为基类继续派生) 2.方法重写: 在基类中某方法可以由子类重新定义实现,则实现步骤如下 在基类中,可以使用关键字 virtual 来定义某方法为虚方法(virtual method),virtual关键字放在访问级别修饰符和方法返回数据类型之间,格式如下: 子类继承父类之后,可以使用 override 关键字覆盖父类中的虚方法,并重新给出实现。 子类也可以不重载基类的虚方法,直接使用基类的实现。 父类中不需要子类重写的方法,不需要写virtual关键字 3.C#中所有的类(包括我们自己定义的类)都直接或者间接的继承来自System.Object类 4.特殊变量base: (1)提供了对父类的访问 (2)访问父类被子类隐藏的变量或者覆盖的方法 (3)每个子类构造方法的第一句,都是隐含地调用base(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错 5.多态的实现方法: (1)子类重写父类的方法 (2)、编写方法时,使用父类定义的方法 (3)、运行时,根据实际创建的对象类型动态决定使用哪个方法 6.密封类:主要是用于防止派生 是用sealed修饰,不能用作基类,因此,它也不能是抽象类 来源: https://www.cnblogs.com/sunxiaoyan/p/8301703.html