多态

PHP面试:什么是类的多态性,请写出一个例子

情到浓时终转凉″ 提交于 2020-03-23 12:26:22
类的三大特性,封装、继承、多态,前两个比较简单,一般不会问到,多态则是考察最多的,一般出现在笔试中。 描述 多态性是指同一操作作用于不同的类的实例上可执行不同的逻辑。 多态是指 执行不同的逻辑 ,很多资料上介绍这里时总是说 “同一操作作用于不同的类的实例上时,会获得不同的结果。”,当年看到时就很困惑,一个函数给不同参数的时候它的结果也是不同的,这不是理所当然的嘛,其他它根本不在乎结果是否相同,而是强调执行不同的逻辑,即走到不同的方法体内。 示例 interface animal{ function can(); } class cat implements animal{ function can(){ echo "I can climb"; } } class dog implements animal{ function can(){ echo "I can swim"; } } function work($obj){ if($obj instanceof animal){ $obj->can(); }else{ echo 'no can'; } } work(new cat()); work(new dog()); 运行work时会根据传入参数的不同,选择执行不同的can方法。 上边的父类是接口,对于接口与普通类同样适用。 来源: https://www.cnblogs

C++ 多态及C和C++的区别

孤者浪人 提交于 2020-03-22 18:20:52
C和c++大的区别: c是面向过程的,数据与算法分开。它的重点在于算法和数据结构。侧重于计算机底层操作。 c++是面向对象的,主要特点是类,封装和继承。与C的区别主要为 :类、继承和多重继承、运算符重载、类模板、C++标准库、模板库。 C++是C的超集,也可以说C是C++的子集,因为C先出现。按常理说,C++编译器能够编译任何C程序,但是C和C++还是有一些小差别。 例如C++增加了C不具有的关键字。这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。 C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库<cstring>头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。 面向对象有三大特征:封装性、继承性、多态性 1.面向对象和面向过程区别 面向过程程序设计:所谓的面向过程程序设计就是函数的定义和调用。简单地说,过程就是程序执行某项操作的一段代码

C++ Virtual 完美诠释

半腔热情 提交于 2020-03-22 18:03:43
解答了我的一些疑问,觉得写的不错!!!转载一下。 virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。 1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致。如下所示: 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。如下,是未将test()函数设置为虚函数前的执行结果: 在将test()函数设置为virtual后,执行结果如下: 如此,便可以将基类与派生类的同名方法区分开,实现多态。 说明: 1.只需将基类中的成员函数声明为虚函数即可,派生类中重写的virtual函数自动成为虚函数; 2.基类中的析构函数必须为虚函数,否则会出现对象释放错误。以上例说明,如果不将基类的析构函数声明为virtual,那么在调用delete p2;语句时将调用基类的析构函数,而不是应当调用的派生类的析构函数,从而出现对象释放错误的问题。 3.虚函数的使用将导致类对象占用更大的内存空间

C++ 虚函数列表与多态 —— 多态的简单用法

社会主义新天地 提交于 2020-03-22 03:56:01
首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 play() 方法,在代码的第35-37行,创建一个父类指针,然后将子类地址引用赋值给父类,这时调用 P 指针的 play() 方法会打印出什么呢。开始我以为会是调用子类的 play() 方法,因为第36行给引用了,但打印结果是:    这是个父类的play 1 #include <iostream> 2 3 class Father 4 { 5 public: 6 void play() 7 { 8 std::cout << "这是个父类的play" << std::endl; 9 } 10 }; 11 12 class Son : public Father 13 { 14 public: 15 void play() 16 { 17 std::cout << "这是个子类的Play" << std::endl; 18 } 19 }; 20 21 22 void party(Father** men, int num) 23 { 24 for (int i = 0; i < num; i++) 25 { 26 men[i]->play(); 27 } 28 } 29 30 int main() 31 { 32 Father father; 33 Son son; 34 35 Father* p;

[C#基础]基础知识一: 面向对象的基本知识.

落花浮王杯 提交于 2020-03-21 07:22:16
激励自己有时间多看看.!! C#基础共分为七个部分:   一: 面向对象 二: 值类型, 引用类型, 字符串操作   三: 集合文件操作   四: 正则表达式   五: XML操作   六: 委托, 事件   七: 反射 1, 面向对象:   面向对象的三大特性: 封装, 继承, 多态 2, 什么是类? 什么是对象? 类和对象的区别?   类: 类似模子, 确定对象将会拥有的特征(属性) 和行为 (方法)   对象是一个你能够看得到, 摸得着的具体实现-- 万物皆对象.     --类是模具, 创建对象的模具, 抽象的      .类是一组数据类型, 用户自定义的数据类型.      .类组成: 字段, 属性, 方法, 构造函数.     --对象是具体的, 是类的具体实例. 对象是具有属性(特征)和方法(行为)     --类中包含了数据(用字段标示)与行为(用方法(函数, 功能)标示, 方法为一块具有名称的代码) 3, 知识点总结 封装继承多态 一、封装:   封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义:   封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

C++的多态性

南楼画角 提交于 2020-03-21 06:53:17
1.静态多态 (1)函数重载 (2)操作符重载 2.动态多态 继承,虚函数 实现机制: 以下摘自于 http://blog.csdn.net/zyq0335/article/details/7657465 1 什么是多态? 多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制 程序实现上是这样,通过父类指针调用子类的函数,可以让父类指针有多种形态。 2 实现机制 举一个例子: #include <iostream.h> class animal { public: void sleep() { cout<<"animal sleep"<<endl; } void breathe() { cout<<"animal breathe"<<endl; } }; class fish:public animal { public: void breathe() { cout<<"fish bubble"<<endl; } }; void main() { fish fh; animal *pAn=&fh; pAn->breathe(); } 答案是输出:animal breathe 结果分析: 1从编译的角度 C++编译器在编译的时候,要确定每个对象调用的函数的地址,这称为早期绑定(early binding),当我们将fish类的对象fh的地址赋给pAn时,C

多态(polymorphism),覆盖(Override),重载(overload)

我的梦境 提交于 2020-03-20 03:37:38
覆盖 override : Overriding 也许叫做 overwriting 更合适, OVERLOAD 覆盖是指在子类( c++ 中的派生类) 中重新定义父类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 重载( overload ): 在同一个类中,出现多个同名的方法的现象就是 Overload 重载事发生在同一个类中,不同方法之间的现象。 在 c++ 或者 java 中,方法一般为 返回类型 方法名 ( 参数 1 ,参数 2) 判断 2 个方法是不是 overload ,主要指方法名一样,参数不一样, 参数不一样指的是参数的个数,相同位置的参数的类型是否一样,而与参数(型参)的名称无关(参数类型 / 个数 / 顺序 , 不同), 与返回类型也无关。程序会根据不同的参数列来确定需要调用的函数 比如 c++ 或者 java 中,这都是 overload void m1(); void m1(int arg); void m1(int arg, char* x);

Java面向对象--三大基本特征之多态性

半城伤御伤魂 提交于 2020-03-18 21:29:37
Java面向对象的三大基本特征是:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),这三大基本特征是学习Java面向对象开发的基础和重点。本篇博客将详细介绍这三大基本特征中多态性的用法。 ☍ 多态性(Polymorphism) 多态性,是面向对象中最重要的概念,也是三大基本特征中最难的一个。简单的理解就是同一个行为具有多个不同表现形式或形态的能力,或者说多态就是同一个接口,使用不同的实例而执行不同操作。 ▴ 对象的多态性 ☃ 父类的引用指向子类的对象(可以直接应用在抽象类和接口上) ☃ 子类的对象可以替代父类的对象使用 ☄ 一个变量只能有一种确定的数据类型 ☄ 一个引用类型变量可能指向(引用)多种不同类型的对象 Person p = new Student(); //父类Peson变量p指向Student对象 ▴ Java引用变量有两个类型 ☃ 编译时类型:由声明该变量时使用的类型决定(看‘=’左边) ☃ 运行时类型:由实际赋给该变量的对象决定(看‘=’右边) //父类 --> 子类 Person-->Student-->GirlStudent // -->BoyStudent 编译时类型 Person p1 = new Student(); 运行时类型 Person p2 = new GirlStudent(); Person

面向对象 三 (三大特性)

可紊 提交于 2020-03-18 07:47:39
封装,继承,多态 一: 了解什么是封装: 就象一个盒子,你不需要知道里面有什么东西,只知道它有那些用处就行,能够为你提供相对应的方法. 封装的意义: 封装的意义在于保护或者防止 代码 (数据)被我们无意中破坏。 保护成员属性,不让类以外的程序直接访问和修改; 隐藏方法细节 关于对象封装的原则: 内聚:内聚是指一个模块内部各个部分之间的关联程度 耦合:耦合指各个模块之前的关联程度 封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别 在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。 1.1 了解访问权限修饰符 所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。 Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四种访问权限的含义和权限控制见下面表格: 注意:所谓的访问,有两种方式,直接访问和通过对象访问。 封装代码例: public class House { // 私有化属性 private String cookroom; private String bathroom; private String bedroom; private String parlor; public String

3.17,继承与多态等

只谈情不闲聊 提交于 2020-03-17 22:58:41
1,主题是继承与多态。 2,继承 ①什么是继承 ②继承的种类,单重继承(一父类一子类)与多重继承(一子类多父类),但是java只支持单重继承,多重继承用接口来实现。 3,多态。 ①什么是多态。 ②多态的种类 编译,重载 运行,动态绑定的覆盖与接口实现。 ③重载与覆盖的区别。 人应该有梦想吧?我不是很确定,毕竟有的人没有,也可以活的很好。而我事实上是个比较具有实际主义的人。但是其实我们也有着最初的感动, 现在是2020.3.17.19.16.这首歌的名字叫 turn back time .专辑的封面我挺喜欢的。带有科技感的东西,所以我希望自己能够推动些社会科技的发展,能够 推动些社会科技的发展。 4,主题是属性的隐藏与对象转换 5,属性的隐藏 ①什么是属性的隐藏, 子类定义了与父类同名的属性,那么父类的属性即被隐藏。 ②this关键字的用法 表示当前对象 表示形参变量 ③super关键字用法 在子类中使用super引入父类的构造方法,但是一定要放到第一排。 指代被隐藏的父类变量如super.xxx. 还有挺多的,记得构造体系起码要3遍吧。 6,对象的实体和引用与上转型对象 ①对象的实体,在你创建对象的时候系统会给他分配一个空间,实体就是这个空间 ②对象的引用,引用简单说就是地址吧,指向那些内存空间。 ③上转型对象,简答说,一代更比一代强。 a为b的父类 已创建a,b对象 b=a;