多态

C++虚函数表剖析

只谈情不闲聊 提交于 2020-02-01 16:47:14
关键词:虚函数,虚表,虚表指针,动态绑定,多态 一、概述 为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。 二、类的虚表 每个包含了虚函数的类都包含一个虚表。 我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。 我们来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,故类A拥有一个虚表。 class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); private: int m_data1, m_data2; }; 类A的虚表如图1所示。 图1:类A的虚表示意图 虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚表,所以虚表的元素并不包括普通函数的函数指针。 虚表内的条目,即虚函数指针的赋值发生在编译器的编译阶段,也就是说在代码的编译阶段,虚表就可以构造出来了。 三、虚表指针 虚表是属于类的,而不是属于某个具体的对象

java基础---25. 接口多态综合案例

放肆的年华 提交于 2020-02-01 16:10:02
1 案例 2 案例分析 3 代码实现 定义一个接口 public interface USB { public abstract void open();//打开设备 public abstract void close();//关闭设备 } 定义一个电脑类 public class Computer { public void powerOn(){ System.out.println("笔记本电脑开机"); } public void powerOff(){ System.out.println("笔记本电脑关机"); } //使用usb设备方法,使用接口作为方法的参数 public void useDevice(USB usb){//接口和父类没有太大的区别都可以当作方法的参数 usb.open();//打开设备 if(usb instanceof Mouse){//一定要先判断 Mouse mouse = (Mouse) usb;//向下转型 mouse.click(); }else if(usb instanceof Keyboard){//先判断 Keyboard keyboard = (Keyboard) usb;//向下转型 keyboard.type(); } usb.close();//关闭设备 } } 定义一个实现类:鼠标 //鼠标就是一种USB设备

多态的概念和意义

限于喜欢 提交于 2020-02-01 14:23:28
函数重写回顾 父类中被重写的函数依然会继承给子类 子类中重写的函数将覆盖父类中的函数 通过作用域分辨符(::)可以访问父类中的函数 Chidl c; Parent*p = &c; c.Parent::print(); //在父类中继承 c.print(); //在子类中重写 p->print(); //父类中定义 面向对象中期望的行为? 根据实际的对象类型判断如何调用重写函数,父类指针(引用)指向父类对象则调用父类中定义的函数,如果指向子类对象则调用子类中定义的重写函数。 面向对象中多态的概念? 根据实际的对象类型决定函数调用的具体目标,同样的语句在实际运行时有多重不同的表现形态 C++语言支持多态的概念 通过使用virtual关键字对多态进行支持 被virtual声明的函数被重写后具有多态特性 被virtual声明的函数叫做虚函数 实验 #include <iostream> #include <string> using namespace std; class Parent { public: virtual void printf() { cout << "I'm Parent" << endl; } }; class Child :public Parent { public: void printf() { cout << "I'm Child" << endl; }

Java总结05 Java集合体系.最高集合接口Collection和其迭代器/一般集合接口List和其迭代器/增强版For循环的应用

谁说我不能喝 提交于 2020-02-01 03:36:06
Collection - 集合 Iterator - 迭代器 Revise — 修改(rɪˈvaɪz) ** 1. 一/Collection集合的创建与应用 Collection本身是个接口,那么如果要把它以集合形式去应用,那么就需要用到多态.而子类则必须是个集合实现类,比如ArrayList. 格式: Collection<E泛型> 多态集合对象自定义名 = new ArrayList<E>(); 如: Collection<String> collectionListObj = new ArrayList<String>(); 常用方法: 1/对象名.add(); 添加元素 2/对象名.remove(); 删除指定元素,因为没有索引值,所以如果存在多个相同元素,则删除最靠前的. 3/对象名.isEmpty(); 判断集合中的元素是否全部为空内容元素,如果是则True,不是则False 4/对象名.contains(); 判断指定元素是否存在集合中 5/对象名.clear(); 清空所有元素(即将所有元素内容清空) 6/对象名.size(); 取集合长度 public static void main ( String [ ] args ) { Collection < String > collectionListObj = new ArrayList < String > (

面向对象特征-多态

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-01 00:56:20
什么是多态? 一个类可以使用不同引用调用不同对象空间 多态只存在于继承中 多态的使用 父类的引用可以指向子类的对象空间(子类空间包括父类空间内的变量方法) 不能反向引用,子类的应用不可以指向父类对象空间(因为父类空间没有子类成员,这么引不就爆炸了吗!同时也找不到子类成员) 无关系的两个类没有多态的概念(所以我认为多态只呈现在对象的引用空间上) 父类引用子类对象空间时,不能调用子类成员(因为父类中不存在子类的成员,引用无效,找不到地址)但是可以进行强制转换,把父类引用强制转换成子类类型(相当于拥有了子类私密空间的钥匙)((Student)person).eat() instanceof 判断一个对象是否属于这个类类型 返回是true/false if(person instanceof Student){} 来源: CSDN 作者: 孤鹤儿 链接: https://blog.csdn.net/qq_42041473/article/details/103795838

20162323周楠 《程序设计与数据结构》第七周学习总结

孤街醉人 提交于 2020-01-31 23:45:47
20162323周楠 2016-2017-2 《程序设计与数据结构》第七周学习总结 教材学习内容总结 1.定义多态,多态引用在不同的时候可以指向不同类型的对象 2.动态绑定(后绑定):很多情形下,方法调用可以与方法定义的绑定可以在编译时完成,但对于多态引用,绑定直到运行时才确定下来,需要调用时所指向的对象的类型来确定要用到哪个方法来定义 3.多态引用在运行时才将方法调用与它的定义绑在一起 4.使用继承机制的创建多态引用:通过继承实现多态 引用变量可以指向声明继承于它的任意类的任何对象。 对象的类型,而不是引用的类型,决定调用的是方法的哪个版本 5.Java接口的目的及语法 接口是一组抽象方法,所以不能被实例化 继承可适用于接口,所以一个接口可派生于另一个接口 6.通过接口实现多态 接口可用来声明对象引用变量 接口引用可以指向实现这个接口的任意类的任何对象 方法的参数可以是多态的,这样使方法具备了对其参数进行控制的灵活性 7.多态环境下的面向对象设计 事件处理:在侦听器和所侦听组件之间建立关系是通过多态完成的 教材学习中的问题和解决过程 问题1:对课本中多态的理解不是很明白 解决方案:通过自己不断地尝试,从内存方面进行理解并结合敲代码终于明白了 代码调试中的问题和解决过程 问题1: 对程序的结果不理解 问题1解决方案:看书查找。如果子类复写了父类的方法,那么调用子类方法的时候

Python学习笔记(九)之面向对象编程(下)

僤鯓⒐⒋嵵緔 提交于 2020-01-31 19:32:55
目录 0. 附上Python面向对象学习笔记上的链接: Python学习笔记(八)之面向对象编程(上) 1. 引言 2. 继承和多态 2.1 继承 2.1.1 继承的含义 2.1.2 继承实例 2.2 多态 2.2.1 多态的含义 2.2.2 多态实例 3. 实例属性和类属性 0. 附上Python面向对象学习笔记上的链接: Python学习笔记(八)之面向对象编程(上) 1. 引言 上一节类比java的面向对象学习了Python中的面向对象的基础知识,以及在最后的总结中比较了一些Python和java中的面向对象的不同。 在java的学习中我了解到, 数据封装、继承和多态是面向对象的三大特点 ,所以在这一章节中,我将继续学习Python的继承和多态的语法和技巧,更加深入的了解Python的面向对象,依旧是类比java学习。 两天没有学习Python面向对象的知识了,所以现在稍微回顾一下上面学到的内容。 首先是定义一个类,可以通过 class 类名(继承自) 的方式定义一个新类; 接着自然是写一个构造函数了,所以 __init__ 函数登场了,在类的的函数中,默认会传入参数 self ,因为Python的构造函数只能有一个,所以参数的传入要比较谨慎的书写,可以通过 关键字参数 传入参数的方式来实现。 再者就是 数据封装 这个面向对象的三大特点之一

Python基础23类-多态

痞子三分冷 提交于 2020-01-31 10:20:43
1 #多态概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不考虑他们具体的类,通过继承实现多态 2 class H2O: 3 def __init__(self,name,temperature): 4 self.name=name 5 self.temperature=temperature 6 def turn_ice(self): 7 if self.temperature < 0 : 8 print('[%s]温度太地结成冰了'%self.name) 9 elif self.temperature > 0 and self.temperature < 100 : 10 print('[%s]液化成水'%self.name) 11 elif self.temperature >= 100 : 12 print('[%s]温度太高变成水蒸气'%self.name) 13 class Water(H2O): 14 pass 15 class Ice(H2O): 16 pass 17 class Steam(H2O): 18 pass 19 20 w1=Water('水',100) 21 s1=Steam('水蒸气',-10) 22 w1.turn_ice() 23 s1.turn_ice() 来源: https://www.cnblogs.com/josie930813

Java 学习多态笔记

风格不统一 提交于 2020-01-31 09:30:42
一. 多态 同一个对象在不同时期表现的出不形态,要构成多态必须满足以下三个前提 1.要有继承或实现 2.有方法的重写 3.有父类的引用指向对象 eg: public class Animal { public String name ="动物"; public void Eat(){ System.out.println("我是"+name); System.out.println("吃东西"); } } public class Cat extends Animal { // 1.有继承 public void Eat(){ // 2.有方法重写 System.out.println("猫吃鱼"); } } public class DuoTaiDemo { public static void main(String[] args) { Animal a = new Cat(); // 3. 有父类引用指向 a.Eat(); } } 二.多态的成员访问特点: 对于成员变量:编译看左边,执行也看左边 (以左边的类为准,调用的都是左边类中的成员方法 即 Animal 类中的成员变量) 对于成员方法:编译看左边,执行也看右边 (以左边的类为准,去编译如果没有方法会报错,但是执行的时候是调用的左边的的方法,因为方法 被重写 即执行Cat类中的Eat()方法) 三.多态的好处和弊端 好处

C#学习笔记——(18)多态

a 夏天 提交于 2020-01-31 02:44:01
基本概念 抽象类和抽象方法 声明抽象类的格式 public abstract class 抽象类名 { 声明类中的各个成员 } 抽象方法 [ 访问修饰符 ] abstract 返回值类型 方法名 ( [ 参数列表 ] ) ; 如果一个类是抽象类的话不能进行实例化,只能作为继承。如果一个类里有抽象方法,则此类不能实例化。 override和overload override(从写) 如果基类中有一个抽象的函数,在派生中给出了具体实现的代码,则称为override。发生在父类和子类之间,父类有一个方法,子类从写了。 overload(从载) 一般发生在同一个类中,指两个方法具有同样的名称,但是具有不同的参数列表。如果仅仅返回值不同,不作为区分的参考。 virtual 成员字段和静态方法不能是virtual。 sealed(密封) sealed类不允许继承,sealed方法不允许重写。 运算符重载(operator) public static 返回值类型 operator 运算符 ( [ 形参表列 ] ) { 函数体 } 例题-多态的演示(以圆、球体和圆柱为例) 多态实现的条件 1、必须在基类和继承类中出现,即基类为 public class Circle ,继承类定义 public class Sphere:Circle ,必须与基类有关系; 2、把发生多态的方法