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程序。
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.面向对象和面向过程区别
面向过程程序设计:所谓的面向过程程序设计就是函数的定义和调用。简单地说,过程就是程序执行某项操作的一段代码,函数是最常用的过程。
面向对象程序设计:面向对象程序设计就是对象加消息。第一,程序一般由类的定义和使用两部分组成,而类的实例即对象;第二,程序中的一切操作都是通过对象发送消息来实现的,对象接收消息后,启动有关方法完成相应的操作。
2.什么是对象
对象可以理解为:用现实生活中来表述是属性+行为,用程序语言来表述是数据(变量)+操作(函数);
对象需要有以下四点特征:
①每一个对象必须有一个名字以区别与其他对象(类的实例)。对于对象来说,每一个对象的数据成员都有其自己独立的存储空间,不同对象的数据成员占有不同的存储空间,而不同对象的成员函数是占有同一个函数代码段的。
②用属性来描述他的某些特征(数据赋值)。
③有一组操作,每个操作决定对象的一种行为(函数调用)。
④对象的操作可以分为两类:一类是自身所承受的操作,另一类是施加于其他对象的操作。
3.面向对象的优点:
①提高程序可重用性:通过继承
②改善程序可维护性:不改变接口而维护接口内部程序实现,不影响用户。
③跟好的支持大型程序设计:分模块设计,做自己的接口,然后整合到一个系统中去。
4.什么是多态
多态是指不同的对象收到相同的消息时产生多种不同的行为方式。C++支持两种多态性,即编译时的多态性(重载:函数/运算符重载)和运行时的多态性(虚函数)。
一般来说多态分为两种:
静态多态:也称为编译时多态,主要包括参数多态,过载多态和强制多态。参数多态:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。如 C++语言中的函数模板和类模板属于参数多态。参数多态又叫静态多态,它的执行速度快,异常少,调用在编译时已经确定。过载多态:同一个名字在不同的上下文中所代表的含义不同。典型的例子是运算符重载和函数重载。强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作。如 int+double,编译系统一般会把 int 转换为 double,然后执行 double+double 运算,这个int->double 的转换,就实现了强制多态,即可是隐式的,也可显式转换。强制多态属于静态多态。
动态多态:也称运行时多态,主要包括:包含多态。包含多态的基础是虚函数。主要是通过类的继承和虚函数来实现,当基类和子类拥有同名同参同返回的方法,且该方法声明为虚方法,当基类对象,指针,引用指向的是派生类的对象的时候,基类对象,指针,引用在调用基类的方法,实际上调用的是派生类方法。
静态多态实现
静态多态靠编译器来实现,简单来说就是编译器对原来的函数名进行修饰。可以根据函数参数的类型,个数,以及修饰函数const,这就使得函数可以重载。同理,模板也是可以实现的,针对不同类型的实参来产生对应的特化的函数,通过增加修饰,使得不同的类型参数的函数得以区分。
动态多态的实现
动态多态靠运行时的类型检查,从而来进行函数的绑定。声明一个类时,如果类中有虚方法,则自动在类中增加一个虚函数指针,该指针指向的是一个虚函数表,虚函数表中存着每个虚函数真正对应的函数地址。动态多态采用一种延迟绑定技术,普通的函数调用,在编译期间就已经确定了调用的函数的地址,所以无论怎样调用,总是那个函数,但是拥有虚函数的类,在调用虚函数时,首先去查虚函数表,然后在确定调用的是哪一个函数,所以,调用的函数是在运行时才会确定的。
5.什么是封装
封装就是把数据和实现操作的代码(函数)集中起来放在对象内部(类),并尽可能的屏蔽对象的内部细节,不能从外部直接访问或修改这些数据(如类中的 private 数据)及代码(如类中函数的代码在外部调用函数时是不可以修改的,是能使用其提供的功能)。使用一个对象的时候只需要知道它向外界提供的接口形式(函数名+参数)而无需知道他的数据结构细节和实现操作的算法。
封装的含义:一是将有关的数据和操作代码封装在一个对象中,各个对象相互独自、互不干扰。而是将对象中的某些数据与操作代码对外隐藏,只留下少量接口,以便于外界联系,接收外界消息。
6.什么是消息
一个对象与另一个对象之间的交互称之为消息。对象之间的联系只能通过消息传递来进行,且具有以下 3 个性质:
①同一个对象可以接收不同形式的多个消息,做出不同的相应。
②相同形式的消息可以传递给不同的对象,所做出的相应可以是不同的。
③对消息的相应并不是必须的,对象可以响应消息,也可以不响应。
实现消息传递的方法:
调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为(功能、操作)。对象所能实现的行为(操作),在程序设计中成为方法,他们是通过调用相应的函数(C++中成为成员函数)来实现的。
参考博客:https://blog.csdn.net/qq_41291253/article/details/100009363
参考博客:https://blog.csdn.net/hycxag/article/details/82978173