c++从入门到入土第十八篇:多态

李憨憨_ 李憨憨_     2022-12-24     646

关键词:

多态



什么是多态

多态性(polymorphism)可以简单地概括为“一个接口,多种方法”,它是面向对象编程领域的核心概念。
多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
编译时多态性(静态多态):通过重载函数实现:先期联编 early binding
运行时多态性(动态多态):通过虚函数实现 :滞后联编 late binding
C++运行时多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(Override),或者称为重写。
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
多态的目的:封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了“接口重用”。也即,不论传递过来的究竟是类的哪个对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。
多态最常见的用法就是声明基类类型的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是固定的,因此将始终调用到同一个函数,这就无法实现“一个接口,多种方法”的目的了。

虚函数重写的两个例外

协变(基类与派生类虚函数返回值类型不同)

析构函数的重写(基类与派生类析构函数的名字不同)

重载、覆盖(重写)、隐藏(重定义)的对比

抽象类

多态的原理

虚函数表



单继承和多继承关系的虚函数表

单继承中的虚函数表

多继承中的虚函数表


多继承:
子类中虚表的个数和直接父类的个数一致;
子类新定义的虚函数,其虚函数指针存放在第一个直接父类的虚表中;

c++从青铜到王者第十八篇:c++之多态(代码片段)

系列文章目录文章目录系列文章目录前言一、多态的概念1.多态的概念二、多态的定义及实现1.多态的构成条件2.虚函数的认识3.虚函数的重写1.虚函数重写的两个例外之协变2.虚函数重写的两个例外之析构函数的重写4.C++11ove... 查看详情

c++从入门到入土第十五篇:list的模拟实现

查看详情

c++从入门到入土第十一篇:string模拟实现(续)

查看详情

c++从入门到入土第十三篇:vector的模拟实现

查看详情

c++从入门到入土第十七篇:继承

继承文章目录继承什么是继承继承方式基类和派生类赋值转换继承中的作用域派生类的默认成员函数多继承什么是继承面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和... 查看详情

c++从入门到入土第十七篇:继承

继承文章目录继承什么是继承继承方式基类和派生类赋值转换继承中的作用域派生类的默认成员函数多继承什么是继承面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和... 查看详情

c++从入门到入土第十篇:string模拟实现

string模拟实现文章目录string模拟实现传统写法1.构造函数2.析构函数3.拷贝构造4.赋值运算符现代写法1.构造函数2.析构函数3.拷贝构造4.赋值运算符类的成员传统写法1.构造函数正确写法:这才是一个空的string类对象,字符... 查看详情

c++从入门到入土第十二篇:vector的介绍与使用

vector的介绍与使用文章目录vector的介绍与使用一、vector的介绍二、vector的使用1.构造函数2.迭代器3.容量4.内容的访问5.增删查改6.迭代器失效的问题一、vector的介绍vector容器是STL中最常用的容器之一,它和array容器非常类似ÿ... 查看详情

c++从入门到入土第十四篇:list的介绍与使用

list的介绍与使用文章目录list的介绍与使用一、list的介绍二、list的使用1.构造函数2.正向迭代器3.反向迭代器4.范围for5.获取首尾元素6.插入元素的相关操作7.删除导致迭代器失效8.resize9.链表的拼接10.remove删除元素11.元素去重12.链... 查看详情

c++从入门到入土第十九篇:二叉搜索树(代码片段)

二叉搜索树文章目录二叉搜索树二叉搜索树概念原理性质复杂度二叉搜索树操作1.结构2.查找3.插入4.中序遍历5.拷贝6.销毁7.删除二叉搜索树概念二叉查找树(BinarySearchTree),(又:二叉搜索树,二叉排序树... 查看详情

c++从入门到入土第十六篇:再谈数据结构--栈和队列

栈和队列文章目录栈和队列栈(stack)练习1练习2栈的模拟实现队列练习1队列的模拟实现栈(stack)栈是一个后进先出的数据结构,本身是一个半封闭的容器;如果想要查看栈当中的每一个元素,它里面是没有一个迭代器的... 查看详情

c++从入门到入土第十六篇:再谈数据结构--栈和队列

栈和队列文章目录栈和队列栈(stack)练习1练习2栈的模拟实现队列练习1队列的模拟实现栈(stack)栈是一个后进先出的数据结构,本身是一个半封闭的容器;如果想要查看栈当中的每一个元素,它里面是没有一个迭代器的... 查看详情

linux从青铜到王者第十八篇:linux网络基础第二篇之tcp协议

系列文章目录文章目录系列文章目录前言一、TCP面向字节流二、TCP粘包问题1.什么是TCP粘包问题2.TCP粘包问题的解决办法三、TCP异常情况四、TCP协议1.TCP协议段格式2.确认应答(ACK)机制3.超时重传机制4.连接管理机制1、TCP三次握手1.... 查看详情

第十八篇inceptionv3实战

文章目录摘要 查看详情

c++从入门到入土第四篇:运算符重载(代码片段)

系列文章目录【C++从入门到入土】第一篇:从C到C++.【C++从入门到入土】第二篇:类和对象基础.【C++从入门到入土】第三篇:类和对象提高.文章目录系列文章目录前言运算符重载1、定义和相... 查看详情

第十八篇js传参数

JS传参数 参数,这是个什么东西呢?简单的说吧,我们去玩别人的网站,一般来个登录,有用户名和密码,当我们输入正确之后,那么这用户名和密码里面的值,就是参数的值,它将这个值传给“参数”,然后提交到后台去... 查看详情

c++从入门到入土第一篇:初识c++

C++入门文章目录C++入门C++关键字(C++98)命名空间1.命名空间的定义2.命名空间的使用C++输入&输出缺省参数1.缺省参数概念2.缺省参数分类函数重载C++关键字(C++98)C+... 查看详情

c++从入门到入土第二篇:c++入门(续)

C++入门文章目录C++入门引用1.引用概念2.引用特性3.常引用4.使用场景5.引用与指针的区别内联函数1.概念2.特性auto关键字基于范围的for循环指针空值nullptr(C++中的关键字)引用1.引用概念引用变量是一个... 查看详情