c++多继承多态

C++多继承多态的实现

如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表。
多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定调用函数的地址,在调用虚函数的时候,去查询虚函数指针所指向的虚函数表。
派生类生成的对象中的虚函数指针指向的是派生类的虚函数表,因此无论是基类还是派生来调用,都是查询的是派生类的表,调用的是派生类的函数。

如果发生了多继承,多个基类中都有虚函数,那么该是怎样的呢?虚函数指针如何排列,多个基类的指针为什么能够同时指向派生类对象,同时发生多态?
请看下面这段程序

#include
#include
using namespace std;

class Base1{

    public:
    void fun()
    {
        printf("this is Base1 fun\n");
    }
    virtual void fun1()
    {
        printf("this is Base1 fun1\n");
    }
};

class Base2{
    public:
    void fun()
    {
        printf("this is Base2 fun\n");
    }
    virtual void fun2()
    {
        printf("this is Base2 fun1\n");
    }
};

class Derived : public Base1,public Base2{
    public:
    void fun()
    {
        printf("this is Derived fun\n");
    }
    void fun1()
    {
        printf("this is Derived fun1\n");
    }
    void fun2()
    {
        printf("this is Derived fun2\n");
    }
};

int main()
{
    Derived  *pd = new Derived();
    Base1 *p1 = (Base1 *)pd;
    Base2 *p2 = (Base2 *)pd;
    p1->fun();
    p2->fun();
    p1->fun1();
    p2->fun2();
    printf("Base1 p1:%x\n", p1);
    printf("Base2 p2:%x\n", p2);
    return 0;
}

运行结果如下

feng@mint ~/code/c++/cpp_muti_drived
$ ./muti_derived
this is Base1 fun
this is Base2 fun
this is Derived fun1
this is Derived fun2
Base1 p1:2097c20
Base2 p2:2097c28

Derived类分别继承了Base1和Base2,根据结果来看,均发生了多态。基类指针调用函数,调用的均是派生类的对象。
通过打印出了p1和p2的地址,发现他们相差了8个字节,就能明白了,在做类型转换的过程中,如果把地址传给第二个基类的指针的时候会自动把地址减去8,在64位系统下,刚好是一个指针的长度。因此p2指向的实际上是第二个虚函数指针的地址,这样,就能够实现多继承的多态了。

Original: https://www.cnblogs.com/0x12345678/p/6987838.html
Author: Hackergin
Title: c++多继承多态

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/642759/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL-连接数据库

    连接数据库在操作数据库之前,需要连接它,输入命令:mysql -u用户名 -p密码。 在你自己本机上连接数据库用上述方式是可以的,不过在平台上连接数据库还需要加上一句-h127.0…

    技术杂谈 2023年7月11日
    064
  • Hadoop常用shell操作(持续更新)

    Hadoop开启单节点DataNode hdfs –daemon start datanodeHadoop开机单节点yarn yarn –daemon start nodema…

    技术杂谈 2023年7月24日
    069
  • nand

    nand flash裸机编程第001节_NAND_FLASH操作原理第002节_NandFlash时序及初始化第003节_NandFlash的芯片id读取第004节_NandFla…

    技术杂谈 2023年6月21日
    081
  • [Pytest]运行指定的case

    当我们写了较多的cases时,如果每次都要全部运行一遍,无疑是很浪费时间的,通过指定case来运行就很方便了。 例子代码: test_aa.py 运行模式: 模式1:直接运行tes…

    技术杂谈 2023年5月31日
    084
  • 享元模式之网店模板

    1、 实例概况 在天猫商城里存在着成天上万的网店,但是天猫所提供的网站模板是一样的,存在许多天猫网店使用同一个网店模板的情况,如果每一个网店都用一个网店对象来表示,因为网店数量巨大…

    技术杂谈 2023年7月23日
    089
  • elasticsearch通用工具类

    这几天写了一个关于es的工具类,主要封装了业务中常用es的常用方法。 本文中使用到的elasticsearch版本6.7,但实际上也支持es7.x以上版本,因为主要是对spring…

    技术杂谈 2023年7月10日
    066
  • Xamarin 跨移动端开发系列(01) — 搭建环境、编译、调试、部署、运行

    (本文是基于老版本的VS和Xamarin,而VS2017已经集成了Xamarin,所以,本文已经过时,最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序 。)…

    技术杂谈 2023年6月1日
    0100
  • node 控制台 颜色输出

    picocolorshttps://www.npmjs.com/package/picocolors 作者:孟繁贵 Email:meng010387@126.com 期待共同进步!…

    技术杂谈 2023年5月31日
    0103
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之联合索引(十一)

    基于Vue和Quasar的前端SPA项目实战之联合索引(十一) 回顾 通过之前文章基于Vue和Quasar的前端SPA项目实战之动态表单(五)的介绍,关于表单元数据配置相关内容已经…

    技术杂谈 2023年7月24日
    077
  • Redis常用概念及操作

    数据库 存储的位置 数据逻辑结构 MySQL、Oracle等数据库 硬盘 关系型数据 Redis 内存 key-value 支持的数据结构多:string、hash、set、lis…

    技术杂谈 2023年7月25日
    075
  • Mysql 事务(标贝科技)

    @ 事务 InnoDB对ACID的支持 隔离级别 + 不同隔离级别下读读取数据可能出现的情况 不可重复读和幻读区别 redo log (共享表空间) redo log block …

    技术杂谈 2023年7月25日
    096
  • 1.层次遍历

    title: 层次遍历 📃 题目描述 题目链接:二叉树的层次遍历 🔔 解题思路 简简单单,用队列来保存每一层的数量,再进行遍历。 class Solution { public: …

    技术杂谈 2023年7月24日
    073
  • 将控件画成圆角的效果(Delphi)

    最近在做一个Delphi的项目,常常要设计软件的界面,需要将控件画成圆角矩形。在Delphi中将控件画成圆角效果,可使用CreateRoundRectRgn函数。在此写了一个通用的…

    技术杂谈 2023年5月31日
    087
  • Linux账户,组,权限管理

    内容多数来源于https://wangchujiang.com/linux-command/c/chmod.html, 开源地址:https://github.com/jaywcj…

    技术杂谈 2023年6月21日
    090
  • PYTORCH: 60分钟 | 神经网络

    神经网络可以使用 torch.nn包构建。 现在你已经对autograd有所了解, nn依赖 autograd 定义模型并对其求微分。 nn.Module 包括层,和一个返回 ou…

    技术杂谈 2023年7月25日
    062
  • SpringBoot后端接口项目

    创建SpringBoot项目 项目目录 实体类 点击查看代码 package com.bai.entity; import com.baomidou.mybatisplus.ann…

    技术杂谈 2023年7月11日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球