多态

牛客 C++刷题day43

怎甘沉沦 提交于 2019-12-01 09:54:03
1.+重载符号前面的操作数必须是一个对象。 2.关联容器(如map, set, multimap,multiset),删除当前的iterator,只会使当前的iterator失效,只要在erase时,递增当前iterator即可。 对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。不过erase方法可以返回下一个有效的iterator,cont.erase(iter++)可以修改为cont.erase(iter) list使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator。 3. 下面我以Clang++编译器为例阐述一下C++继承模型的内存布局 对于多继承情况 考虑示例代码 1 2 3 struct Base1 {...}; struct Base2 {...}; struct Derived : Base1, Base2 {...}; 有如下内存布局 首先出现的是派生类Derived类的虚表指针vptr (这里插入一个提醒: 一直以来vptr都被国人翻译为虚函数表指针 但是vtbl英文原文是virtual table并非virtual function table 为什么呢

学习C++与JAVA的多态

萝らか妹 提交于 2019-12-01 09:47:45
在说这个问题的时候不得不谈到的就是方法重写 我在JAVA中实现这个代码的时候在方法重写的操作上是十分简单的 在JAVA中返回值可以直接填写对象,但是在C++中需要使用指针才能以派生类的对象 (是否能使用“&”饮用对象暂不清楚,另外何时释放的问题暂时还未研究) 如果使用OOP的思想来写一个下面这样的学生管理系统 效果如下 : 人员管理系统 : 添加人员 2. 查询人员信息 请输入功能 :1 请输入人员的职称 (1. 学生 2. 员工 ):1 请输入姓名 :sss 请输入年龄 :111 请输入学号 :12 如果职称是 2 :请输入工号 添加成功 两者的代码结构上区别不大; 但是值得注意点有几个, 第一:C++中可以直接使用域类名::方法名的方式来直接调用方法。 这个方法在学习两种语言中中会使人有一定的困扰,由于JAVA方面还没有学习static修饰 因此目前的java写法调用方法还停留在必须创建对象的阶段,(个人猜想:而C++中由于 本身就可以使用独立的函数,因此也是可以直接调用函数帮忙做事情的) 第二个注意点:不管是C++中还是java中对象数组所存的都是对象的地址, 我在JAVA中的写法是返回值直接定义为派生类,然后直接将派生类存入基类数组 我在c++d如果按照相同的写法在赋值的时候会报错,因此C++中我使用了基类的指针类型 返回值。 第三,

面向对象的基本特征

一个人想着一个人 提交于 2019-12-01 09:41:33
面向对象的三个基本特征是:封装、继承、多态 1.封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 在Java中类中成员的属性有:public, protected, <default>, private,这四个属性的访问权限依次降低。 2.继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承是指使用基类的属性和方法而无需额外编码的能力; 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时,有一点需要注意

多态的基础内容

a 夏天 提交于 2019-12-01 08:50:51
对于多态,可以总结以下几点: 一、使用父类类型的引用指向子类的对象; 二、该引用只能调用父类中定义的方法和变量; 三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。 另转载: 多态是通过: 1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的 2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的. 一、基本概念 多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。 java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。 如果是父类引用指向子类对象这种形式,有以下几种情况: 如果子类重写了父类的某个方法,那么此时调用的是子类重写的方法 如果子类没有重写父类的某个方法,那么此时调用的是父类中的方法 如果子类新增了父类中不存在的方法

20182315 第六周学习总结

被刻印的时光 ゝ 提交于 2019-12-01 08:47:45
20182315 2019-2020-1 《数据结构与面向对象程序设计》第六周学习总结 教材学习内容总结 多态:定义为“有多种形式”,多态引用是指一个在不同时刻可以指向不同类型对象的引用变量。 通过继承实现多态: (1):当某类名声明一个引用变量,该变量可引用这个类的任意对象,还可以引用继承他的类的任何对象。 (2): Mammal pet; Horse secretariat=new Horse(); pet=secretasriat; 该程序将父类定义的变量pet赋给子类Horse使用。但反过来的操作会丢失一些数据,因为子类包括的方法可能是父类所不具备的,所以会引起数据丢失。 (3): Animal creature=new Horse(); 这种思路也是可行的。 (4):Mammal继承于Animal,Horse继承于Mammal。而Animal定义的变量可调用三个类的方法。如果三个类都有move这个方法,那如何调用?在使用前应提前声明 接口:Java的接口是一组常量和抽象方法,抽像方法是一个没有被实现的方法,接口是不能被实现的。接口的抽象方法通常都不加abstract,默认接口都是公共的。 继承适用于接口! 教材学习中的问题和解决过程 问题1:接口由implements接入,如果一个程序想用多个接口,如何处理? 问题1解决方案:一:接口可以连接其他的接口

C++继承和多态

你说的曾经没有我的故事 提交于 2019-12-01 08:44:42
C++继承和多态 继承和派生 C++ 中的继承是类与类之间的关系, 继承(Inheritance) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。 派生(Derive) 和继承是一个概念, 被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼 当你创建的新类与现有的类相似 当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承 class Student: public People 继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式: 包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。 C++三种继承方式 继承方式 限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选项,如果不写,默认为 private(成员变量和成员函数默认也是 private) public、protected、private 指定继承方式 1) public继承方式 基类中所有 public 成员在派生类中为 public 属性;

C++多态与虚函数

↘锁芯ラ 提交于 2019-12-01 08:43:50
C++多态与虚函数 面向对象程序设计语言有封装、继承和多态三种机制,这三种机制能够有效提高程序的可读性、可扩充性和可重用性。 “多态(polymorphism)”指的是同一名字的事物可以完成不同的功能。多态可以分为编译时的多态和运行时的多态 函数的 重载 ,对重载函数的调用,在编译时就能根据实参确定应该调用哪个函数,因此叫编译时的多态;后者则和继承、虚函数等概念是指运行时的多态。 #include <iostream> using namespace std; class People{ public: People(char *name, int age); void display(); protected: char *m_name; int m_age; }; People::People(char *name, int age): m_name(name), m_age(age){} void People::display(){ cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl; } //派生类Teacher class Teacher: public People{ public: Teacher(char *name, int age, int salary); void display(); private: int m

day22 封装、继承和程序设计模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-01 08:39:08
目录 day22 封装、继承和程序设计模式 今日内容概要 昨日回顾 今日内容详细 封装 多态 常见设计模式 day22 封装、继承和程序设计模式 今日内容概要 封装 继承 程序设计模式 单例模式 工厂模式 昨日回顾 一对多组合关系 将多个类的对象作为属性,封装在新类中 继承 class 类名(父类名): 属性 方法 isinstance和issubclass 子类会继承所有父类中的属性和方法,可以直接使用 子类可以重写父类中的属性和方法 super方法可以在子类中调用父类中的方法 super(cls, obj) ,cls参数可以为任意类名,obj可以为任意类,只要合理即可 今日内容详细 封装 “封装”就是将抽象得到的数据和行为相结合,形成一个有机整体 元组,列表,字典等等:数据的封装,通过引用去使用数据 函数:算法的封装 如果没有函数,功能要靠每一行代码去直接执行 没有函数的话,耦合度会很高,复用性很差,开发效率也非常低 封装的目的是简化编程和增加安全性 使用者不必关系具体的实现细节 通过接口(万能的点 . ) 还可以给予特定的访问权限来使用类的成员 明确区分内外 类的实现者 可以修改内部封装的东西而不影响外部调用者 外部调用者 只需要直到自己可以使用该类对象的哪些功能 私有属性和私有方法 标识符以双下划线 __ 开头的是私有成员,在外部不可以直接用这种属性或方法名调用

day 21

老子叫甜甜 提交于 2019-12-01 07:26:29
day 21 组合 封装 01 组合 一个类产生的对象是另一个对象的属性 为了减少代码量 02 封装 什么是封装 把一堆属性(特征与技能)封装到一个对象中。 可以通过(对象.属性)方式调用该属性 为什么要封装 通过(对象.属性)简化操作流程,方便存取 如何封装 在类内部定义一堆属性(特征;变量>数据属性,技能;函数>方法属性) 通过对象.属性=属性值 访问限制机制 在类内部定义的以(__)开头的属性,不能通过对象.属性的方式直接调用 把隐私和不能被外部轻易调用的属性,不可被直接调用 对数据获取的逻辑更加严谨,进而保证了数据的安全 在类中定义一个访问接口,让用户通过return方式获取但不能更改,内部可以进行逻辑判断 在类中定义一个修改接口,让用户通过调用接口方式修改属性值,内部可以进行逻辑判断 在python中不会强制内绝对不能访问,类内部的__属性会变成_类名__属性的形式,同过对象.变形名进行访问 property; python内置的一个装饰器,主要是给类内部的方法使用 将类内部的方法隐藏起来, 将方法的调用方式,改为不需要括号 不能对被装饰过的方法属性修改值(应为它还是方法而不是数据) 修改和删除的方法 多态 多态指同一事物的多种形态,多态性,继承就是多态的一种表现形式 让多种不同类型的对象,在使用相同内容功能的情况下,调用同一种名字的方法 父类;定义一套统一的调用标准

浅谈Java多态

孤人 提交于 2019-12-01 07:18:47
多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。 多态存在的三个必要条件 继承 重写 父类引用指向子类对象(引用还是指向父类) 比如 Parent p = new Child(); ​ 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误; 如果有,再去调用子类的同名方法。 重载(Overload)与重写(Override) 多态中重写的基本规则 参数必须要一样,且返回类型必须兼容 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 即外壳不变,核心重写! 父类定义出其他的程序代码要如何使用方法。不管父类使用了哪种参数,覆盖此方法的子类也一定要使用相同的参数。同样,不论父类声明的返回类型是什么,子类必须要声明返回一样的类型或该类型的子类。要记得, 子类对象必须保证可以执行父类的一切。 不能降低方法存取的极限 简而言之,方法和变量的存取权必须相同或者更为开放。 例如不能把public的方法降低为private。 父类的成员方法只能被它的子类重写。 声明为 final 的方法不能被重写。 声明为 static 的方法不能被重写,但是能够被再次声明。 构造方法不能被重写。 如果不能继承一个方法,那么它一定不能被重写 当需要在子类中调用父类的被重写方法时,要使用 super