C++之“多态性”

多态性概述

一、定义

1、多态:是指同样的消息被不同类型的对象接受时导致完全不同的行为。多态分为编译时的多态和运行时的多态。

2、消息:是指对类的成员函数的调用。

3、编译时的多态:是在编译的过程中确定了同名操作的具体操作对象。

4、运行时的多态:是在程序运行过程中才动态地确定操作所针对的具体对象。

5、联编:确定操作的具体对象的过程,也称为绑定。

6、静态联编:在编译和连接时进行。

7、动态联编:在运行时进行。

二、静态联编与动态联编的对比

静态联编程序执行效率高,执行速度快;动态联编灵活,但执行速度慢。

运算符重载

一、运算符重载

1、定义:使同一个运算符作用于不同类型的数据时导致不同的行为的这种机制。

2、优点:扩展了运算符的功能;比一般的函数调用更简洁、直观、增加程序可读性。

二、不具备重载的运算符

1、成员选择运算符    .

2、成员指针运算符    .*

3、作用域分辨符   ::

4、三目选择运算符    ?:

5、计算数据大小运算符    sizeof

二、运算符的重载规则

1、重载后运算符的优先级与结合性不会改变。

2、不能改变原运算符操作数的个数。

3、不能重载C++中没有的运算符。

4、不能改变运算符的原有语义。

三、重载为类的友元函数

1、定义:将运算符重载为类的友元函数要在类中使用friend关键字来说声明该运算符函数为友元函数。

2、作用:可以自由地访问该类的任何数据成员。

四、重载为类的成员函数

1、定义:将运算符函数重载为类的成员函数。

2、作用:可以自由访问本类的数据成员。

五、重载为类的成员函数的特点

1、双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

2、前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

3、后置单目运算符重载为类的成员函数时,为了与前置单目运算符区别,函数要带有一个整型形参。

六、重载为类的成员函数与友元函数的对比

1、单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

2、=、()、[]、—> 双目运算符不能重载为类的友元函数。

3、类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

4、一个运算符的操作需要修改对象的状态,选择重载为成员函数比较好。

5、运算符所需的操作数希望有隐式类型装换,只能选友元函数。

6、需要重载运算符的运算具有可交换性时,选择重载为友元函数。

虚函数

一、定义

允许函数调用与函数体之间的联系在运行时才建立,是实现动态联编的基础。

二、特点

1、虚函数有函数体。

2、虚函数在静态联编时当成一般成员函数使用。

3、虚函数可以派生,如果在派生类中没有重新定义虚函数,虚函数就充当了派生类的虚函数。

4、虚函数不是静态成员函数,也不能是友元函数。

5、虚函数在类的内部定义。

6、只有类的成员函数才能说明为虚函数,它的声明只能出现在类的定义中。

7、构造函数不能是虚函数,析构函数可以是虚函数。

抽象类

一、抽象类

抽象类是一个特殊的类,是为了抽象的目的而建立的,通过它多态的使用其中的成员函数,为一个类族提供统一的操作界面。

二、纯虚函数

1、定义:是一个在基类中说明的虚函数。

2、作用:为派生类提供一个一致的接口。

三、空虚函数

一种函数体为空的虚函数。

四、纯虚函数与空虚函数的区别

1、纯虚函数没有函数体;空虚函数函数体为空。

2、纯虚函数所在的类是抽象类,不能直接进行实例化;空虚函数所在的类是可以实例化的。

时间: 2024-10-03 07:14:19

C++之“多态性”的相关文章

Java 多态性理解

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.特别注意:当所引用的类型存在继承关系时候,会结合参数的类型,选择相应的方法.可以结合

java 多态性详解及常见面试题

java多态性 多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一.要有继承(包括接口的实现): 二.要有重写: 三.父类引用指向子类对象. 多态的好处: 1.可替换性(substitutability).多态对已存在代码具有可替换性.例如,多态对圆Circle类工作,对其他任

多态性与虚函数

多态性 多态性是面向对象程序设计的一个重要特征.如果一种语言只支持类而不支持多态,是不能被称为面向对象语言的.只能说是基于对象的,如Ada,VB就属于此类. 在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数. 在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去相应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的

对象多态性

基本概念的解释. 多态性的依赖条件是方法的覆写!! 观察如下的一个程序: class A{ public void print(){ System.out.println("A--print()") ; } } class B extends A{ public void print(){ System.out.println("B--print()") ; } } public class Test{ public static void main(String

C++多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了"一个接口,多种方法". 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的. 赋值兼容     不过在说虚函数之前,先介绍一个有关

第十三周阅读项目(4):多态性与虚函数

(1)代码: #include <iostream> using namespace std; class Vehicle //交通工具 { public: void run() const { cout << "run a vehicle. "<<endl; } }; class Car: public Vehicle //汽车 { public: void run() const { cout << "run a car.

C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介

C++基础(早年笔记)—多态性(一)

多态性(一) 多态性就是不同对象收到相同消息时,产生不同的动作.用一个名字定义不同的函数,这些函数执行不同但又类似的操作,即用同样的接口访问功能不同的函数,实现“一个接口,多种方法”. C++支持的多态性分为编译时多态性和运行时多态性.其中编译时多态性主要通过函数重载和操作符重载来实现,而运行时多态通过继承和虚函数来实现. 2.1虚函数 2.1.1引入派生类后的对象指针 使用: 1 #include<iostream> 2 using namespace std; 3 4 class my_b

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux

Java虚拟机 - 多态性实现机制

[深入Java虚拟机]之五:多态性实现机制--静态分派与动态分派 方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析.这在前面的"Java内存区域与内存溢出"一文中有提到. 静态解