多态

多态

余生长醉 提交于 2019-12-04 12:06:01
下面给大家介绍一些关于多态与抽象的知识: 都是一些比较简单的基础知识,如果有大佬能指导一二,那更是感激不尽 多态: 相同行为,不同实现. 静态多态:编译时,系统就能决定调用哪个方法 动态多态:运行中,系统才能动态确定方法所指的对象. 方法的重载: 满足相同的行为,不同的实现,是多态的一种体现,是静态多态. 方法的重写: 单独的重写也是静态多态 动态多态:使用动态绑定和重写实现 数据类型 基本数据类型 引用数据类型 发生原因 赋值时左右两端数据类型不匹配 赋值时左右两端数据类型不匹配 转换类型 自动(小转大) 强制(大转小) 自动(向上转型) 强制(向下转型) 适用范围 除了boolean其他都可以相互转换 只有继承类才能相互转换 对我们来说要想编译,运行都通过,最终只有两种效果: 1. 父类引用指向子类对象. 编译通过:因为子类和父类就是is-a的关系,所以子类对象就是父类类型的,一点问题也没有. 运行通过:因为每个子类对象在产生过程中,都是采用内存叠加的方式 先产生父类对象部分(就是一个完整的父类对象),然后在叠加子类特有 所以,这个子类对象拥有父类类型类型定义的一切内容 唯一的问题是: 当使用父类引用指向子类对象的时候,该引用只能操作到该对象身上继承与父亲的属性和行为,操作不到这个子类对象自己特有的属性和行为. 如果子类重写了父类的行为,那么只要是子类对象,不管用什么引用去指向

利用虚函数实现多态的方式:动态绑定

百般思念 提交于 2019-12-04 11:59:27
基类指针/引用调用虚成员函数时才会发生动态绑定,即只有在程序执行阶段才知道调用哪个版本的虚函数。此时调用对象为该指针/引用的动态类型对象。(静态类型就是定义时的类型,此处也就是基类的类型,一般静态和动态类型时相同的,只有在这种情况下两者可能不同。) OOP(面向对象编程)的核心思想“多态性”的根本就在于上述过程。 规避动态绑定 可以使用作用域运算符规避虚函数的动态绑定机制,这种情况通常是派生类虚函数要调用它覆盖的基类中的虚函数时。 派生类中的虚函数要覆盖基类虚函数时,形参必须严格匹配(不然就成了在派生类中定义一个重载函数)。按c++11标准,可以在想覆盖的派生类虚函数形参括号后加 override 关键字,让编译器帮忙检查。 禁止继承和覆盖 加 final 限定符可以禁止继承和覆盖 class A final{/* */}; // 类A无法被继承 如果一个类中的所有成员都是 public 的,可以用 struct 代替,两者的区别就在于成员的权限设置 struct B{ virtual void fun() final; //虚函数fun()无法被派生类覆盖 } struct C:B{} void fun(); //报错,无法覆盖 来源: https://www.cnblogs.com/j-c-y/p/11862603.html

java 多态

♀尐吖头ヾ 提交于 2019-12-04 10:18:25
多态中,成员特点 成员变量: 编译的时候,参考父类中有没有这个变量,如果有,编译成功,没有编译失败运行的时候,运行的是父类中的变量值编译运行全看父类 成员方法: 编译的时候,参考父类中有没有这个方法,如果有,编译成功,没有编译失败运行的时候,运行的是子类的重写方法编译看父类,运行看子类 来源: https://www.cnblogs.com/logolbq/p/11854604.html

类的多态和多态性

这一生的挚爱 提交于 2019-12-04 08:14:54
类的多态和多态性 很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗。 一、多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 序列数据类型有多种形态:字符串,列表,元组 动物有多种形态:人,狗,猪 1.1 动物的多种形态 # 动物有多种形态:人类、猪、狗 class Animal: def run(self): # 子类约定俗称的必须实现这个方法 raise AttributeError('子类必须实现这个方法') class People(Animal): def run(self): print('人正在走') class Pig(Animal): def run(self): print('pig is walking') class Dog(Animal): def run(self): print('dog is running') peo1 = People() pig1 = Pig() d1 = Dog() peo1.run() pig1.run() d1.run() 人正在走 pig is walking dog is running import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 @abc.abstractmethod #

python- 07 再谈抽象(多态、封装和继承)

走远了吗. 提交于 2019-12-04 06:53:33
# 第七章 再谈抽象# 7.1 对象魔法# 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行# 封装:对外部隐藏有关对象工作原理的细节# 继承:可基于通用类创建出专用类# 7.1.1 多态(无需知道对象所属的类(对象的类型))# 7.1.2 多态和方法(无需知道对象的构造)# 7.1.3 封装'''o = OpenObject()o.set_name('Sir Lancelot')print(o.get_name())'''# 7.1.4 继承# 7.2 类# 7.2.1 类到底是什么 子类、超类# 7.2.2 创建自定义类class Person: def set_name(self, name): self.name = name def get_name(self): return self.name def greet(self): #print('Hello, world! I\'m {}'.format(self.name)) passfoo = Person()bar = Person()foo.set_name('Luke Skywalker')bar.set_name('Anakin Skywalker')print(foo.greet())print(bar.greet())# 7.2.3 属性函数和方法class Class

C++虚函数作用原理(一)——虚函数如何在C++语言逻辑中存在

て烟熏妆下的殇ゞ 提交于 2019-12-04 06:49:10
C++多态,接触其实也没太长的时间。上课的时候老师总是不停的讲,多态可以实现利用一个基类对象调用不同继承类的成员函数。我就会觉得很伤脑筋,这个的原理到底是什么?是什么呢? 开始的时候我觉得自己应该能够把它的原理想出来,因为一直觉得关于这些高级语言的事情,不论看起来多么神奇,其实应该都是之前学的基础累积起来的。所以,我就自己想了一段时间————能够实现这样效果的只有 **指针** 了。 但是这个指针应该怎么定义呢?就算基类中本身定义了一个指针,可是继承类中被继承来的函数在利用基类的时候怎么告诉基类到底调用哪一个继承类的函数呢?真的伤脑筋。 …… 现在是开始这个博客的第二天,我终于可以开始继续写了——因为我开始自己调试观察虚函数。 OK,现在开始了: 首先: 一、没有继承的类 (1)段小小的代码: class A { int x; int y; public: virtual void out() { cout << x << y << endl; cout<<"A"<<endl; } }; int main() { A a; return 0; } 十分明显这段程序中仅仅只有一个类,一个虚函数!现在我们一起来看看类A的成员到底如何分布的。 成员变量 x 和 y 存在。同时出现了 _vptr 。它是什么?没错儿就是虚函数表指针。也就是说这个_vptr就是指向虚函数表(或者理解它为指向

Java中的多态

帅比萌擦擦* 提交于 2019-12-04 06:24:33
多态的前提和体现: 1.有继承/实现关系 2.有方法重写【不必要,但是我们开发中99%的情况使用多态就是为了使用重写后的方法,如果不重写,则使用成员全都是父类,何必使用多态】 3.有父类的引用指向子类对象 多态的成员特点: 多态中除了重写的方法调用子类的,其他所有成员都是使用父类中的,父类没有这些成员则编译报错。 多态的优劣,如何弥补劣势? 好处: 提高了代码的扩展性 弊端: 父类的引用不能使用子类特有成员 //向下转型:大范围的内容Animal转成小范围Cat的内容,解决了多态的弊端 Animal a = new Cat(); Cat c = (Cat)a;//正确,把父类引用向下赋值给子类引用 Dog d = (Dog)a//运行报错:a是只猫,扩大到了Animal,但是强行转成狗就是错误的。 //和强制类型中基本类型转换基本一样 double d = 3.14 int e = (int)d;//3 //向上转型,就是多态。子类对象向上赋值给父类的引用 Animal a = new Cat(); 来源: https://www.cnblogs.com/maomaodesu/p/11837408.html

[多态] java笔记之多态性

江枫思渺然 提交于 2019-12-04 06:22:49
1、多态,说的是对象,说的不是类。 2、      3、多态 = polymorphism 4、      调用如下:          5、      6、口诀:               7、 来源: https://www.cnblogs.com/zf007/p/11837361.html

多态的向上转型与向下转型

旧城冷巷雨未停 提交于 2019-12-04 04:51:18
向上转型 : 当有子类对象赋值给一个父类引用时,多态本身就是向上转型的过程 父类引用指向子类对象 父类类型 变量名 = new 子类类型(); 例如:Father father = new Son();//upcasting (向上转型), 对象引用指向一个Son对象 向下转型 : 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型,向下转型必须以向上转型为前提。 如果是直接创建父类对象,是无法向下转型的。 子类引用指向父类对象,前提是已经进行了向上转型 子类类型 变量名 = (子类类型) 父类类型的变量; Son son = (Son) father; //downcasting (向下转型),father还是指向Son对象 错误的情况: Father f2 = new Father(); Son s2 = (Son) f2;//运行时出错,子类引用不能指向父类对象 向上转型与向下转型的使用: package com.day04 ; /** * @author SFJ * @date 2019/11/10 * @time 21:48 **/ public class Test1 { public static void main (String[] args) { Person person = new Student() ; /