多态

[设计模式] 模板模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-13 03:37:25
应用场景: 某一事物的具体流程是固定的。 但其中的步骤或者某些步骤可能会变化。 我们将流程虚函数化,架构化。 应用来实现多态。 ===> 前人(架构)写的代码,来调用后来人(工程师)写的代码。 来源: CSDN 作者: natual177 链接: https://blog.csdn.net/natual177/article/details/103464301

Java多态性理解

谁都会走 提交于 2019-12-12 16:01:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java中多态性的实现 什么是多态 面向对象的三大特性 :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义 : 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现多态的技术称为 :动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的作用 : 消除类型之间的耦合关系 。 现实中,关于多态的例子不胜枚举 。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。 下面是多态存在的三个必要条件,要求大家做梦时都能背出来! 多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象 。 多态的好处 : 1. 可替换性(substitutability)。 多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2. 可扩充性

对Java多态的理解

北慕城南 提交于 2019-12-12 16:01:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java中多态性的实现 什么是多态 面向对象的三大特性 :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义 :指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现多态的技术称为 :动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的作用 :消除类型之间的耦合关系。 现实中,关于多态的例子不胜枚举 。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。 下面是多态存在的三个必要条件,要求大家做梦时都能背出来! 多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象。 多态的好处 : 1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2.可扩充性

【总结】虚函数小结

自作多情 提交于 2019-12-12 01:42:50
虚函数小结 1) 虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数。这是虚函数的基本功能,就不再解释了。 2) 构造函数不能是虚函数。而且,在构造函数中调用虚函数,实际执行的是父类的对应函数,因为自己还没有构造好, 多态是被disable的。 3) 析构函数可以是虚函数,而且,在一个复杂类结构中,这往往是必须的(delete 指向子类的父类指针时,不会析构子类)。 4) 将一个函数定义为纯虚函数,实际上是将这个类定义为抽象类,不能实例化对象。(与第5点结合) 5) 纯虚函数通常没有定义体,但也完全可以拥有。 6) 析构函数可以是纯虚的,但纯虚析构函数必须有定义体,因为析构函数的调用是在子类中隐含的。 7) 非纯的虚函数必须有定义体,不然是一个错误。 8) 派生类的override虚函数定义必须和父类完全一致。除了一个特例,如果父类中返回值是一个指针或引用,子类override时可以返回这个指针(或引用)的派生。例如,在上面的例子中,在Base中定义了 virtual Base* clone(); 在Derived中可以定义为 virtual Derived* clone()。可以看到,这种放松对于Clone模式是非常有用的。 9)基类private纯虚函数:在C++中virtual表示多态,public

C++对象之内存(有继承)

我的梦境 提交于 2019-12-11 17:36:14
上一篇 介绍了C++对象在无继承的各种情况下的内存空间占用情况和内存布局,这一篇来讨论有继承时的情况。有继承的情况会复杂一些,本文会分为四个层次讨论:单一继承无多态、单一继承有多态、多重继承和虚拟继承。本文中的一些图片和一些观点来自《深入探索C++对象模型》,它C++对象的底层原理讲解得非常详细,强烈安利! 如无特别说明,以下代码均在64位机器上的VS2019运行 在C++继承模型中,子类是自己的成员与父类的成员的总和。但标准并没有规定子类和父类的排列顺序,大部分编译器将父类放在子类前面,但virtual base class除外,后面会讨论到。 单一继承无多态 一、空类 class Concrete1 { }; class Concrete2 : public Concrete1 { }; 输出sizeof(Concrete2)结果是1。原因和无继承时的空类大小为1的原因一样,空类的实例也需要有独一无二的内存地址,因此空类被赋予了1字节。 二、非空类 内存布局 在没有虚函数时,类的内存布局和C语言的struct完全一样。 代码测试 代码测试一下: class Point2d { protected: float _x, _y; }; class Point3d : public Point2d { protected: float _z; }; //main函数中: cout <

Java学习笔记(9)--- 重写,重载,多态

这一生的挚爱 提交于 2019-12-11 15:34:26
1.重写: a.定义: 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例子: class Animal { public void move ( ) { System . out . println ( " 动物可以移动 " ) ; } } class Dog extends Animal { public void move ( ) { System . out . println ( " 狗可以跑和走 " ) ; } } 然后我们引用: Animal a = new Animal ( ) ; // Animal 对象 Animal b = new Dog ( ) ; // Dog 对象 a . move ( ) ; // 执行 Animal 类的方法 b . move ( ) ; // 执行 Dog 类的方法 输出为: 动物可以移动 狗可以跑和走 在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法(我们重写的方法) 这是由于在编译阶段,只是检查参数的引用类型。 然而在运行时,Java 虚拟机(JVM

50 多态

一世执手 提交于 2019-12-11 15:29:27
多态三要素: 1.继承 2.重写父类方法 3.父类引用指向子类对象 代码: package _20191211; /** * 多态 * @author TEDU * */ public class PolymorphicTest { /** *多态三要素: *1.继承 *2.重写父类方法 *3.父类引用指向子类对象 */ public static void main(String[] args) { Animal animal = new Animal(); animal.shout();//没有多态 Animal dog = new Dog();//3. 父类引用指向子类对象 dog.shout();//父类引用调用重写的方法,多态发生 //换个Cat试试 Animal cat = new Cat(); cat.shout(); } } class Animal{ public void shout() { System.out.println("叫~"); } } class Dog extends Animal{//1.继承 @Override public void shout() {// 2.重写父类方法 System.out.println("汪汪汪~"); } } class Cat extends Animal{ @Override public void

Java面向对象-6.多态

穿精又带淫゛_ 提交于 2019-12-11 12:42:35
多态:事物存在的多种形态 Animal a = new Cat ( ) ; //父类引用指向子类对象 a . eat ( ) ; //子类必须重写父类eat方法,才能多态调用 /* 多态的三个前提 1.继承(继承抽象类,接口都可以) 2.重写 3.父类引用指向子类对象 */ /* 多态中的 1.成员变量:编译看左边父类,运行看左边父类(Fu f) 2.成员方法:编译看左边父类,运行看右边子类(动态绑定) 3.静态成员方法:不存在覆盖一说,编译看左边,运行看左边 只有非静态的成员方法,编译看左边,运行看右边。 */ 多态成员变量 多态成员方法 多态类型转换 多态的好处: 提高了代码的维护性(继承保证) 提高了代码的扩展性(多态保证) 多态的弊端:不能使用子类的特有功能(父类没有子类的该方法和变量) 来源: CSDN 作者: 董铠 链接: https://blog.csdn.net/weixin_43203731/article/details/103489305

多态的另一表现------对象转型

放肆的年华 提交于 2019-12-11 12:35:41
多态------向上转型 发生条件:1、实例化对象 2、具有重写方法 package NoFirst ; class Message { public void print ( ) { System.out.println ( "www.mldn.cn" ) ; } } class DataBaseMessage extends Message { public void print ( ) { System.out.println ( "oracle连接数据库!" ) ; } } class WebServerMessage extends Message { public void print ( ) { System.out.println ( "web服务器连接" ) ; } } public class ClassUpCast { public static void main ( String args [ ] ) { fun ( new DataBaseMessage ( )) ; fun ( new WebServerMessage ( )) ; } public static void fun ( DataBaseMessage dbm ) { msg.print ( ) ; } public static void fun ( WebServerMessage

C++中的 虚函数 纯虚函数 虚基类(virtual)

China☆狼群 提交于 2019-12-11 10:34:55
前言 :需要了解三者的区别,必须要掌握多态的三个必要条件: 继承 重载 父类指针指向子类对象。 虚函数 纯虚函数 虚基类三者区别 1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。 2.纯虚函数是用来定义接口的,也就是基类中定义一个纯虚函数,基类不用实现,让子类来实现。 3.虚基类是用来在多继承中,比如菱形继承中,如果两个父类继承自同一个类,就只实例化一个父类 ①虚函数 第一个是没有使用多态(只用继承)的一般实现方式: class A { public: void printf(){ cout<<"printf A"<<endl; } }; class B : public A { public: void printf(){ cout<<"printf B"<<endl; } }; int main(int argc, const char * argv[]) { A *a = new A(); a->printf(); B *b = new B(); b->printf(); return 0; } 结果: printf A printf B 这是早期没有多态的代码,缺点:代码冗余 下面是使用了多态但是没有引用virtual关键字的情况: int main(int argc, const char * argv[]) { A *a =