C++ 多态
2016-07-06 16:30
246 查看
一、静态绑定和动态绑定
(1)、静态绑定
–编译时就能确定一条函数调用语句要调用的函数
–在程序编译时多态性体现在函数和运算符的重载上
(2)、动态绑定
–运行时才能确定函数调用语句调用的函数
–程序运行时的多态性通过继承和虚函数来体现
二、多态概念
多态性概念:具有继承关系的类,其对象对同一个函数调用可以作出不同的响应,同一个函数调用(同一条函数调用语句),不同的响应(执行不同的函数);
多态的优点:(1)多态性有助于更好地对程序进行抽象
–控制模块能专注于一般性问题的处理
–具体的操作交给具体的对象去做
(2)多态性有助于提高程序的可扩展性
–可以把控制模块与被操作的对象分开
–可以添加已定义类的新对象,并能管理该对象
–可以添加新类(已有类的派生类)的新对象,并能管理该对象
三、虚函数
虚函数的概念:在基类中冠以关键字
virtual 的成员函数。
虚函数的定义:
–virtual
函数类型 函数名称(参数列表);
–如果一个函数在基类中被声明为虚函数,则他在所有派生类中都是虚函数(包括重定义函数)。
只有通过基类指针或引用调用虚函数才能引发动态绑定。
主要事项:
(1)、在类体系中访问一个虚函数时,应使用指向基类类型的指针或对基类类型的引用,以满足运行时多态性的要求。当然也可以像调用普通成员函数那样利用对象名来调用一个函数。
(2)、在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的说明完全一致,否则就属于重载。
(3)、若在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码。
(4)、虚函数必须是类的一个成员函数,不能是友元,但它可以是另一个类的友元。虚函数不得是一个静态成员。
四、虚函数和重载函数的区别
(1)、成员函数被重载需要在相同范围(同一个类中),而虚函数要求在不同的范围(一个在派生类,一个在基类)
(2)、重载函数要求函数有相同函数名称,并有不同的参数序列;而虚函数则要求函数名、返回值类型和参数序列完全相同
(3)、重载函数可以是成员函数或友员函数,而虚函数只能是成员函数
(4)、重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数
(5)、虚函数在运行时表现出多态功能,这是C++的精髓;而重载函数则在编译时表现出多态性
五、纯虚函数
(1)、实现多态性的前提
–需要有共同的基类
–需要在基类中定义共同的接口
–接口要定义为虚函数
(2)、如果基类的接口没办法实现怎么办?
–如形状类Shape
(3)、解决方法
–不实现这些接口:纯虚函数
–包含纯虚函数的类:抽象基类
(4)、在基类中不能给出有意义的虚函数定义,这时可以把它说明成纯虚函数,把它的定义留给派生类来做
(5)、定义纯虚函数:
class
类名{
virtual
返回值类型 函数名(参数表) = 0;
};
(6)、纯虚函数不需要实现
(1)、静态绑定
–编译时就能确定一条函数调用语句要调用的函数
–在程序编译时多态性体现在函数和运算符的重载上
(2)、动态绑定
–运行时才能确定函数调用语句调用的函数
–程序运行时的多态性通过继承和虚函数来体现
二、多态概念
多态性概念:具有继承关系的类,其对象对同一个函数调用可以作出不同的响应,同一个函数调用(同一条函数调用语句),不同的响应(执行不同的函数);
多态的优点:(1)多态性有助于更好地对程序进行抽象
–控制模块能专注于一般性问题的处理
–具体的操作交给具体的对象去做
(2)多态性有助于提高程序的可扩展性
–可以把控制模块与被操作的对象分开
–可以添加已定义类的新对象,并能管理该对象
–可以添加新类(已有类的派生类)的新对象,并能管理该对象
三、虚函数
虚函数的概念:在基类中冠以关键字
virtual 的成员函数。
虚函数的定义:
–virtual
函数类型 函数名称(参数列表);
–如果一个函数在基类中被声明为虚函数,则他在所有派生类中都是虚函数(包括重定义函数)。
只有通过基类指针或引用调用虚函数才能引发动态绑定。
主要事项:
(1)、在类体系中访问一个虚函数时,应使用指向基类类型的指针或对基类类型的引用,以满足运行时多态性的要求。当然也可以像调用普通成员函数那样利用对象名来调用一个函数。
(2)、在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的说明完全一致,否则就属于重载。
(3)、若在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码。
(4)、虚函数必须是类的一个成员函数,不能是友元,但它可以是另一个类的友元。虚函数不得是一个静态成员。
四、虚函数和重载函数的区别
(1)、成员函数被重载需要在相同范围(同一个类中),而虚函数要求在不同的范围(一个在派生类,一个在基类)
(2)、重载函数要求函数有相同函数名称,并有不同的参数序列;而虚函数则要求函数名、返回值类型和参数序列完全相同
(3)、重载函数可以是成员函数或友员函数,而虚函数只能是成员函数
(4)、重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数
(5)、虚函数在运行时表现出多态功能,这是C++的精髓;而重载函数则在编译时表现出多态性
五、纯虚函数
(1)、实现多态性的前提
–需要有共同的基类
–需要在基类中定义共同的接口
–接口要定义为虚函数
(2)、如果基类的接口没办法实现怎么办?
–如形状类Shape
(3)、解决方法
–不实现这些接口:纯虚函数
–包含纯虚函数的类:抽象基类
(4)、在基类中不能给出有意义的虚函数定义,这时可以把它说明成纯虚函数,把它的定义留给派生类来做
(5)、定义纯虚函数:
class
类名{
virtual
返回值类型 函数名(参数表) = 0;
};
(6)、纯虚函数不需要实现
相关文章推荐
- 深入解析Radix Sort基数排序算法思想及C语言实现示例
- C语言变长数组 struct中char data[0]的用法
- C语言中变量的作用域
- 二叉树二叉链表存储结构 <函数实现:BiTreeFun.cpp>
- C语言实现程序跳转到绝对地址0x100000处执行
- 新的开始--C++征途
- 详解计数排序算法及C语言程序中的实现
- 合并两个有序数组 merging two sorted arrary to make a sorted arrary
- c++面向对象编程(四)--模板
- c++面向对象编程(三)--多态
- lambda在C++中的应用
- 嵌入式程序设计中C/C++代码的优化
- 详解桶排序算法的思路及C++编程中的代码实现
- c++ 控制台弹出文件管理对话框
- c/c++函数传参 坑死我了
- 桶排序算法的理解及C语言版代码示例
- c语言中函数的调用的栈帧
- LeetCode 239: Sliding Window Maximum
- C语言学习笔记(五)
- C语言学习笔记(四)