多态

封装继承多态到底讲的是什么

青春壹個敷衍的年華 提交于 2019-12-21 09:03:18
封装继承多态到底讲的是什么 封装、继承、多态并不是针对C#语言提出来的,他是一个在面向对象思想下产生的一个概念。所以想要弄明白封装、继承、多态,首先就要先了解面向对象概念。封装:当我们提及面向对象的时候,这个对象怎么来?就是通过我们人为的封装得来。封装就是把一些特征或功能组合到一个抽象的对象上。就比如说电脑:它的特征是有一个显示屏,有一个主机,有鼠标和键盘等等。功能有计算等。那我们把这些特征和功能组合到“电脑”这个抽象的名词上时,“电脑”于是就有了这些特征和功能。但这个“电脑”不是实物,它代表所有名叫“电脑”的实物的名称。在C#中,我们把封装好的抽象的名词叫"class",所以我们称“电脑”叫一个类(class),而实体电脑叫这个类的对象(或者叫实例)。 而继承、多态则是类的特性。 继承:这个词就用正常的语义来解释就可以了,比如说你继承了你父亲的优点。而在C#中类也是可以继承的(单继承),比如说我们有了“电脑”这个类,现在我们再定义一个类叫“联想电脑”,难道我们要把电脑的特征、功能再定义一遍?可以是可以的,但是这样一方面代码有点重复,另一方向也不方便管理和说明“联想电脑”的特征。所以我们可以让“联想电脑”继承于“电脑”这个类,我们称“联想电脑”为“电脑”的子类或派生类,而“电脑”叫做父类或基类。这样,只要“电脑”有的东西,“联想电脑”都有,但是“联想电脑”还可以进化出(再添加

python基础实验:模拟音频播放器

∥☆過路亽.° 提交于 2019-12-21 08:33:11
假设用程序播放音频。一个播放器对象(mediaplayerobject)创建AudioFile 对象,执行 play 方法。play()方法负责解码音频文件,并播放,其行为可简单 描述为audio-file.play()。但解码音频文件,需要根据不同的文件使用不同的 算法,wav,mp3,wma,ogg,显然不能用同一种算法解码。如果,要为每种文件定 义一个play()方法,那得定义很多少个方法?!而且,随着技术发展,出现新的 音频文件格式怎么办,定义多少个方法够用呢?使用继承和多态可以简化设计。 思路是这样的,每种格式用 AudioFile 的一个子类表示,如 WavFile、MP3File 等。每个子类都有自己的play()方法,但该方法根据不同子类实现不同的解码算 法和播放功能。而播放器对象永远不必知道 AudioFile 指的是哪个子类,播放器 只需调用play()方法,让对象的多态机制处理具体的解码播放即可。 本练习涵盖继承、覆盖、多态技术 # polymorphism exercise class AudioFile: def __init__(self, filename): if not filename.endswith(filename[-3:]): raise Exception("Invalid file format") self.filename =

多态 重载 重写

佐手、 提交于 2019-12-21 07:33:15
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则: 1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。 3、重写的方法的返回值必须和被重写的方法的返回一致; 4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类; 5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。 6、静态方法不能被重写为非静态的方法(会编译出错)。 overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。 重载的规则: 1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响; 多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。 一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。 多态

接口,继承,抽象类

元气小坏坏 提交于 2019-12-21 05:12:56
多态: 1、引用多态 2、方法多态 引用多态: 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 public class Animal{ } public class Cat extends Animal{ } Animal an = new Animal(); Animal cat = new cat(); 方法多态: 创建本类对象时,调用的方法为本类方法 创建子类对象时,调用的方法为子类重写的方法或者 继承的方法。 public class Animal{   public void move()   {     System.out.println("move");   } } //重写父类的方法move public class Cat extends Animal{   public void move()   {     System.out.println("cat walk");   } } Animal an = new Animal(); Animal cat = new cat(); an.move(); // move cat.move(); // cat walk -------------------------------------------------- instanceof关键字 引用类型转换 1、向上类型转换(隐式/自动类型转换)

Java多态之向上转型

送分小仙女□ 提交于 2019-12-21 05:12:53
文章目录 Java多态之向上转型 多态的优点 向上转型 概念 向上转型好在哪 Java多态之向上转型 多态性是面向对象的第三大特征。 多态的优点 改善代码的组织结构和可读性。 能够创建可扩展的程序。( 随时可以加入新功能 ) 消除类型之间的 耦合 关系。 说实话,作为小白的我,并不太能够理解上面三个优点。随着深入学习,理解应该会越来越深吧,共勉。 向上转型 概念 Java允许把子类对象赋值给父类的引用变量,不用做任何强制转换,系统自动完成 。向上转型来自于自下而上的继承关系,子类继承父类,子类是一种特殊的父类,所以向上转型的操作其实是情理之中的。 下面依照简单的代码,来试着理解向上转型的概念与好处。 package com . my . pac14 ; /** * @auther Summerday */ public class DynamicBinding { //Object是所有类的超类,根据向上转型,该方法可以接受任何类型的对象 public static void test ( Object x ) { System . out . println ( x . toString ( ) ) ; } public static void main ( String [ ] args ) { test ( new PrimaryStudent ( ) ) ; /

python基础----多态与多态性、super函数用法、继承原理

夙愿已清 提交于 2019-12-20 10:14:09
一、多态与多态性 ㈠多态: 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组。 2. 动物有多种形态:人,狗,猪 1 import abc 2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 3 @abc.abstractmethod 4 def talk(self): 5 pass 6 7 class People(Animal): #动物的形态之一:人 8 def talk(self): 9 print('say hello') 10 11 class Dog(Animal): #动物的形态之二:狗 12 def talk(self): 13 print('say wangwang') 14 15 class Pig(Animal): #动物的形态之三:猪 16 def talk(self): 17 print('say aoao') 3. 文件有多种形态:文件文件,可执行文件 1 import abc 2 class File(metaclass=abc.ABCMeta): #同一类事物:文件 3 @abc.abstractmethod 4 def click(self): 5 pass 6 7 class Text(File): #文件的形态之一

【逆向知识】动态调试技巧-C++代码逆向

为君一笑 提交于 2019-12-20 09:08:08
1、C++类代码的特点 寄存器ECX传参时一般用作this指针(对象地址)或是计数器。 有ecx传参的call,是成员函数,构造函数,析构函数 能访问成员变量的函数都会有ecx传参 静态函数、全局函数无ecx(this指针) 返回值 寄存器eax一般用作返回值 识别构造函数的OD反汇编代码 特点: (1) 代码特点:没有返回值、用于初始化 (2)反汇编特点:有返回值,而且是this指针 根据反汇编可以看出成员变量的顺序,因为在内存数据中的排布顺序是由代码中成员变量定义顺序决定的。 识别构造函数的办法: (1)构造函数调用时,会使用ECX用于this指针 (2)构造函数在反汇编层有返回值,是eax存放this指针 (3)构造函数用于初始化,一般内存如果是未初始化的比如CCCCCCC,经过构造函数会完成初始化。 (4)如果一个函数有对前4字节初始化为一个指针地址,那么可能是在初始化虚函数表指针。 如果一个类有虚函数,那么对象的内存数据里会有虚函数指针的定义。构造函数会初始化虚函数表指针,而类中定义多少个虚函数也只有一个虚函数表指针。 识别成员函数的OD反汇编代码 特点: (1)ECX传递this指针,调用成员函数 (2)成员函数中会访问exc所指向的内存空间 成员函数与虚函数本身没有什么区别,所以反汇编出来的代码都差不多。 识别成员函数: (1)如果找到了构造函数

类和正则表达

断了今生、忘了曾经 提交于 2019-12-20 08:49:26
类的三个基本特征:封装,继承,多态; 封装 封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承是指使用基类的属性和方法而无需额外编码的能力; 接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力; 可视继承是指子类使用基类的外观和实现代码的能力。 多态性 是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数

C#的面向对象之继承与多态

我怕爱的太早我们不能终老 提交于 2019-12-20 08:20:54
1、继承的两个特性:传递性、单根性 2、多态   同一操作作用于不同类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。 3、调用父类的成员的关键字:base 4、父类中的成员如果采用private修饰符,它将作为私有成员,其他任何类都无法访问。 5、如果将父类中的成员设置为公有(public)成员,则任何类都可以访问该成员,这不符合我们的要求。 6、C#中提供了另一种访问修饰符protected,被这个访问修饰符修饰的成员允许被其子类访问,而不允许其他非子类访问。 6、 子类继承父类,在编写子类的构造函数时注意一下两点:    1、隐式调用父类的构造函数:   如果子类的构造函数没有使用base关键字指明调用父类的哪个构造函数,则父类必须提供一个默认的无参构造函数。因为子类构造函数在这种情况下会隐式调用父类的默认无        参构造函数base()   2、显示调用父类的构造函数:   如果父类中没有提供默认的无参构造函数,那么子类的构造函数必须明确指明调用的是哪个父类的有参构造函数 7、如果子类的成员和父类的成员同名了使用new关键字。 8、C#中还有一个特殊的关键字sealed,用它修饰的类是不能被继承的。我们称这种类为密封类 9、使用继承的价值   Ø继承模拟了现实世界的关系,这符合我们面向对象编程的思考方向。   Ø继承实现了代码的重用,合理的使用继承

虚函数实现原理

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