多态

【Python学习之旅】---多态(类的相关知识)

こ雲淡風輕ζ 提交于 2020-01-01 22:43:36
#多态反应的是执行时候的状态,不同对象调用的相同方法,调用同一个类,但运行结果不一样,属于继承的一种体现机制。class H2O: def __init__(self,name,wendu): self.name=name self.wendu=wendu def turn_ice(self): if self.wendu < 0: print('【%s】温度太低成冰了' %self.name) elif self.wendu > 0 and self.wendu <100 : print('【%s】温度太高融成水了' %self.name) else: print('【%s】温度太高成蒸汽了' %self.name)w1=H2O('水',20) #水实例化i1=H2O('冰',-2) #冰实例化z1=H2O('蒸汽',1000) #蒸汽实例化w1.turn_ice() #水调用H2O的方法i1.turn_ice() #冰调用H2O的方法z1.turn_ice() #蒸汽调用H2O的方法def fun(obj): #将重复调用的代码用函数来实现 obj.turn_ice() #任一一对象调用此方法fun(z1) #传入对象#执行结果: 【水】温度太高融成水了 【冰】温度太低成冰了 【蒸汽】温度太高成蒸汽了 【蒸汽】温度太高成蒸汽了 来源: https://www.cnblogs

c++虚函数详解(你肯定懂了)

孤者浪人 提交于 2020-01-01 17:29:57
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。 当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 言归正传,让我们一起进入虚函数的世界。 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样

单继承、多继承、菱形继承的虚函数表

自古美人都是妖i 提交于 2020-01-01 13:06:49
文章目录 前言 问题 测试环境 开始测试 无虚函数简单类结构 包含虚函数的类结构 单继承 多继承 菱形继承 虚继承 总结 前言 最近被问到一个关于多继承虚函数表的问题,当时回答是可能存在多个虚函数表,应该是顺序排列的,但具体怎么排列还是有些疑惑的,回答的时候到有点儿心虚。之后查了资料,做了简单的实验,可以确定的是对于继承了多个含有虚函数基类的子类来说,指向虚函数表的指针应该不止一个。 问题 虚函数表的问题是从C++多态的概念引出的,要想实现多态有3个条件: 存在继承:没有继承就没有多态(运行时),在多态中必须存在有继承关系的父类和子类。 重写函数:父类中需要定义带有 virtual 关键字的函数,而在子类中重写一个名字和参数与父类中定义完全相同的函数。 向上转型:将父类的指针和引用指向子类的对象。 满足以上三个条件,当使用父类的指针调用带有 virtual 关键字的函数时,就会产生多态行为。 实现这种多态表现的核心内容就是虚函数表,对于带有 virtual 关键字的函数地址会被放入一个表格,而在类中会有一个指向虚函数表的指针指向这个表格,表明这个表格属于类的一部分。 对于父类来说,这个表格中都是自己类的虚函数,而对于子类来说,首先这个虚函数表包含父类中所有的虚函数,当子类重写某个虚函数时就会用子类重写后的函数地址替换原来父类中定义的函数地址

多态的笔记

99封情书 提交于 2020-01-01 00:24:44
文章目录 多态 多态的概述 多态中成员访问特点 多态的好处和弊端 写一个多态程序的步骤(必须掌握) 多态中的转型 多态的案例 抽象类 抽象类的概述 抽象类的特点 **抽象类的成员特点** 抽象类的案例 接口 接口的概述 接口的举例 接口的特点 **接口的成员特点** 接口的案例 类和接口的关系 抽象类和接口的区别 综合案例 多态 多态的概述 什么是多态? 答:同一个对象,在不同的时刻有多种形态 比如: Animal an = new Cat ( ) ; Animal an = new Dog ( ) ; 多态的举例 绿巨人 , 是正常人的时候是班纳,发怒后就变为绿巨人 毛毛虫,刚开始是个虫,过段时间后就变为蝶了。 多态的形式:具体类多态、 抽象类多态、接口多态 多态的前提 要有实现 || 继承关系 要有方法的重写 体现:继承关系下,子类重写父类的方法;实现关系下,实现类 来实现接口中的方法 父类的引用类型的变量指向了子类对象,接口的引用类型变量指向了实现类对象 多态中成员访问特点 成员访问特点 成员变量( 实际开发中不太关注 ) 编译看左边,运行看左边 成员方法(重点掌握) 编译看左边,运行看右边 总结:编译全看左边,只有成员方法运行看右边 代码展示: // 动物类 public class Animal { public int age = 40 ; public void

多态知识点

心已入冬 提交于 2019-12-31 14:29:12
1.一个对象拥有多种形态,称为对象的多态性,如刘星既有学生形态,也有人类形态。 2.代码中体现多态性(子类被当作父类使用) 格式为:Fu aa = new Zi(); 父类名称 对象名 = new 子类名称(); 接口名称 对象名 = new 实现类名称(); 3.Fu bb = new Zi(); 当直接通过对象名称调用方法时,看等号右边是谁,优先用谁; 当直接通过对象名称访问成员变量时,看等号左边是谁,优先用谁,没有则向上找; 间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上找。 4.成员变量:编译看左边,运行还看左边; 成员方法:编译看左边,运行看右边。 5.Employee one = new Teacher();one.work(); Employee two = new Assistant(); two.work(); 多态的好处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变。 6.判断父类引用的对象,本来是什么子类,格式为:对象 instanceof 类名称 7.Fu a = new Zi(); 如果想调用Zi类中特有的方法,代码如下: if(a instanceof Zi){ Zi z = (Zi)a; z.gg(); } 来源: CSDN 作者: carryL1 链接: https://blog.csdn.net/carryL1

面向对象学习之路(1)

≡放荡痞女 提交于 2019-12-31 10:06:27
OO: 面向对象的三大特性 即 封装,继承 ,多态 封装:封装的意义在于复用,将相同的功能聚集在类中,当我们需要使用它时,就可以直接调用。好的封装不仅可以提高代码的复用性,对于软件的维护也有很大的优势。 继承:继承在面向对象的方法中 主要有两类,一种是子类增加了新方法,主要目的是为了复用基类中的实现,另一种则覆盖了基类的方法,主要目的是复用基类的接口,来实现接下来要说的多态。 多态:肖雅峰师哥提出了多态中重写和重载的问题,我想可以通过一个父子的比喻来解释,重写相当于一个比较叛逆的孩子,尽管他们都有相似的外貌(方法名 ,参数列表,返回类型都相同 ps:子类的方法的返回值是父类中方法返回值的子类时除外)但因为他们的性格不同,处理事情的风格截然不同(方法体重写)。重载则类似于一个家庭中的乖乖养子,尽管有着不同的外貌(参数类型,参数个数,参数顺序都有可能不同),但因受到家庭教育的缘故,在待人处事时往往有相同风格。 AOP AOP 是OOP的有益补充,在面向对象时,OOP往往聚焦于对象的业务,而AOP在这个基础上更进了一步,它从不同的角度来看待对象的业务,因此AOP得名 面向对象切面编程。 AOP的优势在于,AOP将面向对象过程中,一些业务中重复(相同)的部分截取出来,并将它放在一个独立的类里,这样就大大减少了面向对象过程中重复的 运行负载,且独立出来的这个类仍然可以掌控全局(执行原有的职责

Python—多态

半世苍凉 提交于 2019-12-30 14:05:35
Python中的多态通常和继承在一起说,继承、多态、封装是Python面向对象的三大特性。 多态:声明的形参的时候是父类对象,实际运行的时候是子类对象 特性: 1、多态可以增加代码的灵活度 2、以重写和继承父类方法为前提 3、不会影响到类内部设计 下面拿例子具体给大家解释: class Pay ( object ) : def pay ( self , money ) : pass class Alipay ( Pay ) : def pay ( self , money ) : print ( "支付宝支付了{}元" . format ( money ) ) class Applepay ( Pay ) : def pay ( self , money ) : print ( "apple pay 支付了{}元" . format ( money ) ) class Person ( object ) : def consumption ( self , pay , money ) : pay . pay ( money ) alipay = Alipay ( ) apple_pay = Applepay ( ) person = Person ( ) 结果: 支付宝支付了 1000 元 apple pay 支付了 2000 元 来源: CSDN 作者: HENG302926

Java学习笔记(十)——多态

风格不统一 提交于 2019-12-30 05:36:45
一、多态 1、对象的多种形态 (1)引用多态: 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 (2)方法多态: 创建本类对象时,调用的方法为本类方法: 创建子类对象时,调用的方法是子类方法,如果没重写,调用的就是继承父类的方法 (3) 父类的引用是不可以调用子类特有的方法。 二、多态中的引用类型转换 1、向上类型转换(隐式/自动类型转换) 小类型到大类型的转换 2、向下类型转换(强制类型转换) 大类型到小类型的转换 3、instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。 4、一个demo 5、使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题的一个demo 三、抽象类 1、语法定义 在类前面使用abstract修饰的类就是抽象类 2、应用场景: (1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。 (2)从多个具有相同特征的子类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。 3、作用: 限制规定子类必须实现的某些方法,但不关注实现细节。 4、使用规则: (1)使用abstract定义抽象类 (2)abstract定义抽象方法,只有声明,不需要实现 (3)包含抽象方法的类是抽象类 (4)抽象类中可以包含普通的方法,也可以没有抽象方法。

Java—多态

末鹿安然 提交于 2019-12-30 05:36:17
多态——对象的多种形态(继承是多态实现的基础) 引用多态:父类的引用可以指向本类的对象;父类的引用可以指向子类的对象 方法多态:创建本类对象时,调用的方法为本类方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法 父类的引用不能调用子类独有的方法 package com.test; public class Animal { public int age = 1; public void eat() { System.out.println("动物具有吃东西的能力"); } } package com.test; public class Cat extends Animal{ public int age = 2; public void eat() { System.out.println("兔子吃胡萝卜"); } public void nature() { System.out.println("兔子胆小"); } } package com.test; public class Initail { public static void main(String[] args) { Animal animal = new Animal(); Animal cat = new Cat(); //Cat cat1 = new Animal();错误 animal.eat

多态,抽象类和抽象方法,接口

佐手、 提交于 2019-12-30 05:36:05
多态:   继承,重写后,基类引用指向子类对象。   调用基类被重写的方法时,实际new的是哪个子类对象,调用哪个子类对象方法。   多态是执行期间(非编译)判断所引用的对象的实际类型。   提升可扩展性。   使用举例:      方法传入基类对象(接口对象)作为形参,实际调用时,如果传入的是子类对象(实现接口的对象),则调用形参成员时,调用的是实际参数,即子类对象(实现接口的对象)的成员。 抽象类和抽象方法:   抽象方法只需声明,不用实现。   public abstract void a();   抽象方法用来被子类重写,且子类必须重写,否则子类要声明为抽象类。   有抽象方法的类即为抽象类且必须声明为抽象类。   抽象类只能被继承,不能实例化。 接口:   public interface A{     public static final int i = 1;     public void B();   }   接口可以多重实现。   接口是抽象方法和常量值的集合。   接口是特殊的抽象类,只包含常量和方法的定义,没有变量和方法的实现。   变量默认且必须public static且final。   方法默认且必须public abstract。   接口解决了“多继承”时,子类对象包含的多个父类对象成员重名问题,成员属于接口,不属于实现接口的对象。