c++多态
来源:互联网 发布:哈尔滨金蝶软件 编辑:程序博客网 时间:2024/06/05 23:48
多态:多态是C++三大特性之一。是指不同功能的函数可以用同一函数名,在系统运行时根据参数类型来调用相应的成员函数。
从系统实现角度来看,多态性分为两类,动态多态和静态多态。
1.静态多态性:函数重载和泛型编程属于静态多态,是在编译期间完成的。
2.动态多态性:(动态绑定)是在函数运行期间根据实际类型调用相应的方法,虚函数。
动态绑定的条件:
1.基类中必须含有虚函数。
2.通过基类类型的引用/指针来指向派生类对象的方法来调用。
虚函数:为了实现多态而引入的概念。作用是:允许派生类中重新重写与基类中同名的函数,并且通过父类的引用/指针来访问派生类中的成员函数。
一、虚函数使用方法
在基类中用关键字virtual申明成员函数为虚函数,这样就可以在派生类中重新定义该函数,赋予新的功能。
在派生类中重写该虚函数的:①基类中必须申明该函数为虚函数,②函数原型必须一致(函数名,参数列表,返回值)协变除外。
C++规定当一个成员函数被声明为虚函数后,派生类中的同名函数自动为虚函数,但在派生类中的重写的函数最好前面也加上virtual关键字。
#include<iostream>using namespace std;class Base{public: virtual void Print() { cout << "Base::Print() " << endl; }private: int _b;};class D :public Base{public: virtual void Print() { cout << "D::Print() " << endl; }private: int _d;};void test(Base &p){ p.Print();}int main(){ Base b; D d; test(b); test(d); return 0;}
穿的参数分别是指向派生类和基类对象的引用。
由上述例子得知多态成立条件:在继承体系下,要有虚函数的重写,用父类指针/引用指向子类对象。
说明:
1.构造函数不能为虚函数,因为构造函数是初始化对象用的,既然没有对象就不能调用虚函数,申明为虚函数也就没有意义,C++编译器规定构造函数不能为虚函数。
2.静态成员函数不能为虚函数,因为静态成员函数是类共享的成员函数,没有this指针也就不能访问到。
3.友元函数不能为虚函数,因为友元函数不是支持继承。也就不再继承体系下不能为虚函数
4.析构函数最好设置为虚函数。为了防止析构函数只析构基类,而不析构派生类的对象。例如 Base *pb=new D;如果只析构基类,就会存在内存泄漏等问题。
纯虚函数
在成员函数的参数列表后面加上=0,例如
virtual void Print()=0;
含有纯虚函数的类称为抽象类,不能够产生对象。
虚函数的调用
含有虚函数的类,对象模型里面多出4个字节,用来存放虚表指针,指向一个虚表。
这个虚表是编译器维护的。
多态的调用:取虚表地址,当前对象前4个字节,拿到相应的虚函数,调用虚函数。
派生类虚表里的虚函数顺序:
1.先拷贝基类的虚函数表。
2.如果派生类重写了基类的某个虚函数,就在相同的位置替换为派生类的虚函数。
3.最后是派生类自己的虚函数。
- [C/C++]多态
- C++--多态
- C++-----------------多态
- C 多态
- c++-->多态
- 【C++】多态
- 【C#】 多态
- 【C#】多态
- 【c++】多态
- 多态(C++)
- 【C++】多态
- <c++>多态
- C++--多态
- Objective-c 多态
- Objective-C多态
- Objective-C多态(二)
- Objective-C 多态
- C++ 多态
- NYOJ--488--dfs--素数环
- 配置服务器 —— 安装Nginx
- Burst Balloons (第八周 分治 + 动态规划)
- 删除用户建立的所有数据库表以及查询某个字段存在哪张表中
- 一些关于直播的术语
- c++多态
- Ros语音
- C陷阱与缺陷阅读笔记(上)
- 《APUE》读书笔记—第七章进程环境
- JAVA实现栈的基本操作
- java单元测试
- 博弈论简单介绍及代码
- ffmpeg--学习笔记1-基本使用
- js校验座机和手机