0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详谈C++特性:多态的概念分类和实现原理

如意 来源:CSDN 作者:cherrydreamsover 2020-06-29 12:54 次阅读

一、多态的概念

在说多态之前,我们来先看一看对象的类型

详谈C++特性:多态的概念分类和实现原理

来看一个例子:

详谈C++特性:多态的概念分类和实现原理

多态:意思既是同一个事物的多种形态,用我们C++的专业词语来说就是:一个借口、多种实现方式。

二、多态分类

详谈C++特性:多态的概念分类和实现原理

静态多态:

静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。

动态多态:

动态多态就是我们常说的多态。动态多态是在程序运行期间才决定调用哪个函数,是根据虚函数表实现的。声明了虚函数的类,类中都有一张虚函数表,里面存放类的入口地址。通过赋值兼容规则,可以用父类的指针或引用找到子类的虚函数。虚函数是处理类的派生体系中不同层次上不同作用域的同名问题,因此动态多态必须在类的继承体系中才能实现。

三、多态的实现原理(动态)

说到这里,有几个非常重要的概念,需要我们加以区分:重载、重写、重定义

通过上面的多态的介绍,这里来说几个重要的概念:

(1)虚函数表指针:类中除了定义成员函数之外还有一个成员是虚函数表指针(占四个基本内存单位),这个指针指向一个虚函数表的起始位置,这个表会与类的定义同时出现,这个表会与类的定义同时出现,这个表存放着该类的虚函数指针,调用的时候可以找到该类虚函数表指针,通过虚函数表指针找到虚函数表,通过虚函数表的偏移找到函数的入口地址,从而找到要使用的虚函数。

(2)当实例化一个该类的子类对象的时候,(如果)该类的子类并没有定义虚函数,但是却从父类中继承了虚函数,所以在实例化该类子类对象的时候也会产生一个虚函数表,这个虚函数表是子类的虚函数表,但是记录的子类的虚函数地址却是与父类的是一样的。所以通过子类对象的虚函数表指针找到自己的虚函数表,在自己的虚函数表找到的要执行的函数指针也是父类的相应函数入口的地址。

(3)如果我们在子类中定义了从父类继承来的虚函数,对于父类来说情况是不变的,对于子类来说它的虚函数表与之前的虚函数表是一样的,但是此时子类定义了自己的(从父类那继承来的)相应函数,所以它的虚函数表当中管于这个函数的指针就会覆盖掉原有的指向父类函数的指针的值,换句话说就是指向了自己定义的相应函数,这样如果用父类的指针,指向子类的对象,就会通过子类对象当中的虚函数表指针找到子类的虚函数表,从而通过子类的虚函数表找到子类的相应虚函数地址,而此时的地址已经是该函数自己定义的虚函数入口地址,而不是父类的相应虚函数入口地址,所以执行的将会是子类当中的虚函数。这就是多态的原理。

(4)纯虚函数

在成员函数的参数列表后面写上“=0”则该成员函数为纯虚函数。

包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。

纯虚函数在抽象类中重新定义以后,派生类才能实现实例化出对象。

详谈C++特性:多态的概念分类和实现原理

总结:

(1)派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同(协变除外)

协变:基类和派生类中的虚函数名字和参数列表相同、返回值类型不同,基类中的虚函数返回Base*,派生类中的虚函数返回Derived*

(2)基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。

(3)只有类的非静态成员函数才能定义为虚函数,静态成员函数不能定义为虚函数。

(4)如果在类外定义虚函数,只能在声明函数时加virtual关键字,定义时不用加。

(5)构造函数不能定义为虚函数,虽然可以将operator=定义为虚函数,但最好不要这么做,使用时容易混淆

(6)不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的行为。

(7)最好将基类的析构函数声明为虚函数。(析构函数比较特殊,因为派生类的析构函数跟基类的析构函数名称不一样,但是构成覆盖,这里编译器做了特殊处理)

(8)虚表是对所有类对象实例共用的

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • 动态多态
    +关注

    关注

    0

    文章

    4

    浏览量

    5882
  • 静态多态
    +关注

    关注

    0

    文章

    2

    浏览量

    5471
收藏 人收藏

    评论

    相关推荐

    C++多态详解

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
    发表于 09-20 17:18 325次阅读

    如何完备地实现C++多态性?

    如何完备地实现C++多态性?虚函数怎么使用?
    发表于 04-28 06:44

    嵌入式开发与C++开发到底有什么区别呢

    我们常听到嵌入式开发与C++开发,那么他们到底有什么区别呢?今天主要从概念以及技术应用领域的不同来介绍。一、概念有区别C++C语言的继承,
    发表于 11-05 08:27

    STM32 C++代码封装初探相关资料推荐

    一、STM32与面向对象编程上一章中提到了,C++的核心之一就在于面向对象思想。相比C语言常用的面向过程编程,面向对象编程的优势在于继承、封装、多态特性,利用这种思想更有助于我们的程
    发表于 02-11 06:05

    基于Java多态性的应用程序设计

    Java 中的多态体现在类的继承和实现接口等方面。通过对与多态有关的概念进行归纳比较,从继承和接口两方面对多态的正确
    发表于 09-09 08:51 24次下载

    C++的动态多态和静态多态

    多态C++ 中面向对象技术的核心机制之一包含静态多态和动态多态它们之间有一定的相似性但是应用范围不同该文论述了这种相似性并重点论述了以模板实现
    发表于 06-29 15:41 41次下载
    <b class='flag-5'>C++</b>的动态<b class='flag-5'>多态</b>和静态<b class='flag-5'>多态</b>

    java多态性的实现

    Java中多态性的实现 什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为
    发表于 09-27 10:36 9次下载

    C++程序设计教程之多态的详细资料说明

    本文档详细介绍的是C++程序设计教程之多态的详细资料说明主要内容包括了:1.继承召唤多态 (Inheritance Summon up Polymorphism) ,2.抽象编程的困惑
    发表于 02-22 10:52 9次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>多态</b>的详细资料说明

    C++程序设计教程之多态性与虚函数的详细资料说明

    本文档详细介绍的是C++程序设计教程之多态性与虚函数的详细资料说明主要资料包括了:1 多态性的概念,2 一个典型的例子,3 虚函数,4 纯虚函数与抽象类
    发表于 03-14 16:39 5次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>多态</b>性与虚函数的详细资料说明

    C++三大特性:封装的概念原理

    我们都知道C++有三大特性:封装、继承、多态,之前我总结过继承的知识点,现在来总结一下封装的相关知识!
    的头像 发表于 06-29 14:28 6109次阅读
    <b class='flag-5'>C++</b>三大<b class='flag-5'>特性</b>:封装的<b class='flag-5'>概念</b>原理

    Java理论:快速理解多态特性与具体实现

    众所周知,Java的三大特性:封装,继承与多态。本文方便读者朋友们快速理解Java语言中的多态性,以便在面试过程及日常开发中更好的指导具体编程思维,因而自我总结如下:
    的头像 发表于 06-30 17:34 1848次阅读

    详谈电连接器端接的分类、优势及工艺要求

    详谈电连接器端接的分类、优势及工艺要求
    发表于 08-06 16:54 2942次阅读

    C++基础语法中的引用、封装和多态

    本期是C++基础语法分享的第六节,今天给大家来分享一下: (1)引用; (2)宏; (3)成员初始化列表; (4)封装; (5)继承; (6)多态; 引用 左值引用 常规引用,一般表示对象的身份
    的头像 发表于 09-12 09:58 1150次阅读

    C++中如何用虚函数实现多态

    01 — C++虚函数探索 C++是一门面向对象语言,在C++里运行时多态是由虚函数和纯虚函数实现的,现在我们看下在
    的头像 发表于 09-29 14:18 1470次阅读

    如何通过poly实现C++编译期多态

      而folly::poly出来的晚一些,主要使用c++的新特性实现相关的功能,依赖比较少,所以本文将更多的以poly的实现来分析编译期多态
    的头像 发表于 12-05 09:10 442次阅读