多态

游戏开发面试总结2

风流意气都作罢 提交于 2019-11-29 15:04:29
总结一些面试常问的吧 1:聊一聊虚函数吧 C++中,虚函数主要是实现了多态机制,简而言之就是 用父类型的指针指向了子类型的实例,然后通过父类的指针去调用子类的成员函数。 每一个含有虚函数的类都至少有一个与之对应的虚函数表,存放着这个类所由虚函数对应的函数指针。 虚函数表在构建的过程中的步骤:    1:拷贝基类的虚函数表   2:替换重写的虚函数指针   3:追加子类的虚函数指针 这些步骤是编译器完成的 2: 虚析构函数:虚析构函数使得在删除指向子类对象的基类指针的时候可以调用子类的析构函数达到释放子类中堆内存的目的,防止内存泄漏 当delete父类的指针时,由于子类的析构函数和父类的析构函数形成多态,所以先调用子类的析构函数再调用父类的析构函数 。 纯虚函数:形式为virtual void fun() = 0; 不需要实现,因为不会被调用到 抽象基类:至少有一个纯虚函数的类,抽象基类不能产生改类的对象,但是可以有这个类的指针或者引用;子类中必须将纯虚函数实现,否则子类也是抽象基类 3: 聊一聊堆排序吧 堆排序分为两个步骤:   1:根据初始的输入数据,进行HeapAdjust形成初始堆     复杂度为O(n),包括比较和交换 公式可以写为s = 2^( i - 1 ) * ( k - i ),2^( i - 1) 表示该层上有多少个元素,( k - i)

C++多态原理与内部结构

陌路散爱 提交于 2019-11-29 14:59:05
多态类型 多态可以分为 静态多态 和 动态多态 : 静态多态其实就是重载 ,因为静态多态是指在编译时期在形成符号表的时候, 对函数名做了区分 ,根据参数列表来决定调用哪个函数, 也叫编译时多态 ; 动态多态是指通过子类重写父类的虚函数来实现 的,因为是 在运行期间决定调用的函数 ,所以称为 动态多态 ,一般情况下我们不区分这两个时所说的多态就是指动态多态。 动态多态的实现与虚函数表,虚函数指针相关,下面详述。 虚函数相关 首先我们来说一下,C++中多态的表象, 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数 。如果对象类型是派生类,就调用派生类的函数,如果是基类,就调用基类的函数。 实际上, 当一个类中包含虚函数时,编译器会为该类生成一个虚函数表,保存该类中虚函数的地址 ,同样,派生类继承基类,派生类中自然一定有虚函数,所以 编译器也会为派生类生成自己的虚函数表 。当我们定义一个派生类对象时,编译器检测该类型有虚函数,所以为这个派生 类对象生成一个虚函数指针,指向该类型的虚函数表 ,这个虚函数 指针的初始化在构造函数中完成 的。后续如果有一个基类类型的指针,指向派生类,那么当调用虚函数时, 从对象的前4个字节中取虚表地址 ,根据所指真正对象的虚函数表指针去寻找虚函数的地址,也就可以调用派生类的虚函数表中的虚函数

复习----面向对象

非 Y 不嫁゛ 提交于 2019-11-29 14:58:28
本节内容: 1、概述 2、创建类和对象 3、面向对象三大特性   3.1封装   3.2继承   3.3多态 1、概述 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式,对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。 两种最重要的编程范式分别是面向过程编程和面向对象编程, 而python还支持函数式编程。 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向对象编程( Object Oriented Programming,OOP ) OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。   面向对象的几个核心特性如下:   

[C#]多态

坚强是说给别人听的谎言 提交于 2019-11-29 14:06:05
多态可以用 1、virtul override 2、abstract override 3、interface 实现。 例子1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StudyCS { class Program { static void Main(string[] args) { Persion LiLei = new Persion("lilei"); Pig P1 = new Pig("pei qi"); StudyPolymorphic[] tmp = { LiLei, P1 }; for (int i = 0; i < tmp.Length; i++) tmp[i].run(); Console.ReadLine(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StudyCS { public class StudyPolymorphic {

python 面向对象之多态

不问归期 提交于 2019-11-29 13:56:18
多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print('say hello') class Dog(Animal): #动物的形态之二:狗 def talk(self): print('say wangwang') class Pig(Animal): #动物的形态之三:猪 def talk(self): print('say aoao') 文件有多种形态:文本文件,可执行文件 import abc class File(metaclass=abc.ABCMeta): #同一类事物:文件 @abc.abstractmethod def click(self): pass class Text(File): #文件的形态之一:文本文件 def click(self): print('open file') class ExeFile(File): #文件的形态之二:可执行文件 def click(self): print('execute file') 多态性 一

C++三大特性(继承、封装、多态)

穿精又带淫゛_ 提交于 2019-11-29 12:25:59
封装 就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。 继承 指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”( Inheritance)和“组合”( Composition)来实现。继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承:是指直接使用基类的属性和方法而无需额外编码的能力; 接口继承:是指仅使用属性和方法的名称、但是子类必须提供实现的能力。 可视继承:可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 多态 是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同

Java多态

。_饼干妹妹 提交于 2019-11-29 12:17:37
多态: 一个函数名根据对象不同对应不同实现 1)静多态 (编译期多态)(静态绑定)→ 函数重载 重载条件:在一个类,函数名相同,参数列表不同 2)动多态 (运行期多态)(动态绑定) 发生动态绑定的条件 (1)继承(2)重写(3)向上造型(基类的引用 引用的派生类的对象) 向上造型 Animal a = new Cat();//是一个 Object o = new Integer(10); People p = new Teacher(); 向下造型都是错的 instanceof关键字 作用:用来判断某个对象是否属于某种数据类型。 注意 : 返回类型为布尔类型 3)多态的实现原理 地址覆盖问题 来源: CSDN 作者: 酸奶解酒 链接: https://blog.csdn.net/weixin_43751188/article/details/103245250

javaSE面向对象2

*爱你&永不变心* 提交于 2019-11-29 11:14:58
1 继承 继承的概念 继承也叫传承,也就是自上而下的传递;当我们在描述某些事物的时候 发现 有些事物具有重复的属性和行为,那么 就可以将这些重复的东西进行抽取 组合成一个新的类别,这个新的类别称之为父类。 通过extends关键字可以实现类与类的继承: class子类名 extends 父类名{ } 继承的好处和弊端 提高了代码的复用性:多个相同的成员可以方法放到同一个类中; 提高了代码的为属性:如果功能的代码需要修改,修改一处即可; 让类与类之间产生了关系,是多态的前提:其实这也是继承的一个弊端,类的耦合性很强; 开发原则:低耦合,高内聚 耦合:类与类的关系; 内聚:就是自己完成某件事情的能力。 注意 和传统的理解不同,子类并不是父类的一个子集。实际上,一个子类通常比它的父类包含更多的信息和方法。 父类中的私有数据域在该类之外是不可访问的。因此,不能在子类中直接使用。但是,如果父类中定义了公共的访问器 / 修改器,那么可以通过这些公共的访问器 / 修改器来访问和修改它们。 不是所有的 “是一种”(isa) 关系都该用继承来建模。例如:正方形是一种矩形,但是不应该定义一个 Square 类来扩展 Rectangle 类,因为 width 和 height 属性并不适合于正方形。应该定义一个继承自 CeometricObject 类的 Square 类,并为正方形的边定义一个

多态中成员访问特点

£可爱£侵袭症+ 提交于 2019-11-29 10:12:40
package day8; public class Polymorphyic { public static void main(String[] args) { Fruit f = new apple(); System.out.println(f.num);//成员变量运行看左边,输出父类 num,“10” apple a = new apple(); a.print();//成员方法看右边,输出子类 print(),“子类构造方法” } } class Fruit{ int num=10;//父类成员变量 public void print(){ System.out.println("父类构造方法"); } } class apple extends Fruit{ int num=20;//子类成员变量 public void print(){ System.out.println("子类构造方法"); } } 运行结果: 10 子类构造方法 总结: 成员变量:编译看左边父类,运行看 左边 父类 成员方法:编译看左边父类,运行看 右边 子类 来源: https://www.cnblogs.com/time123/p/11512987.html

为什么构造函数不能是虚函数(转)

北城余情 提交于 2019-11-29 10:11:16
来源: http://blog.sina.com.cn/s/blog_620882f401016ri2.html 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable 的指针 其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是 对象还没有实例化,也就是内存空间还没有,无法找到vtable ,所以构造函数不能是虚函数。 2,从使用角度 虚函数主要用于在信息不全的情况下,能使重写的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。 虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而 构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用 ,因此也就规定构造函数不能是虚函数。 4、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数 从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数 5、 当一个构造函数被调用时,它做的首要的事情之一是初始化它的V P T R 。因此,它 只能知道它是“当前”类的 ,而完全忽视这个对象后面是否还有继承者。