807-C++多继承下,派生类对象有几张虚函数表?

2023-11-03

C++多继承下,派生类对象有几张虚函数表?

我们看下面这个示例:

#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;

class Base1//基类
{
public:
	Base1() : x(1) {}
	virtual void play() { cout << "Base1::play basketball" << endl; }
	virtual void dance() { cout << "Base1::dance dance" << endl; }
private:
	int x;
}; 

class Base2//基类
{
public:
	Base2() : y(2) {}
	virtual void print() { cout << "Base2::print hello world" << endl; }
private:
	int y;
}; 

class Base3//基类
{
public:
	Base3() : z(3) {}
	virtual void sing() { cout << "Base3::sing song" << endl; }

private:
	int z;
};

class Derived : public Base1, public Base2, public Base3//派生类多继承
{
public:
	Derived() : w(4) {}
	virtual void play() { cout << "Derived::play basketball" << endl; }
	virtual void print() { cout << "Derived::print hello world" << endl; }
	virtual void sing() { cout << "Derived::sing song" << endl; }
private:
	int w;
};

int main()
{
	Base1* p1 = new Derived();
	Base2* p2 = new Derived();
	Base3* p3 = new Derived();

	p1->play();
	p2->print();
	p3->sing();
	p1->dance();

	return 0;
}

运行截图:
在这里插入图片描述
关于C++多态和继承的知识点,在我的C++专栏有详细的叙述。
我们看今天的重点!

C++多继承下,派生类对象有几张虚函数表?
我们打开VS编译器的工具下的命令行:
执行

cl –d1reportSingleClassLayoutDerived  main.cpp

在这里插入图片描述
我们可以清楚的看到:派生类对象有三个虚函数表,分别对应于三个基类。

这些东西在编译阶段就生成指令了,哪个类型的基类指针,访问的就是对应的vfptr,找对应的vftable,取虚函数地址,这不是水到渠成的?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

807-C++多继承下,派生类对象有几张虚函数表? 的相关文章

随机推荐

  • 心理学的166个现象---之九

    161 增减效应 人们最喜欢那些对自己的喜欢显得不断增加的人 最不喜欢那些对自己的喜欢显得不断减少的人 心理学家们将人际交往中的这种现象称为 增减效应 162 植物心理学和巴克斯特效应BACKSTER 我出生在新泽西州的LAFAYETTE市
  • 51单片机---DS18B20温度采集

    51单片机 DS18B20温度采集 实验目标 51单片机读取DS18B20温度显示在液晶显示屏上 实验步骤 在Proteus里画出原理图 在Keil里用C语言编写程序 在Proteus中导入HEX文件 启动仿真 DS18B20简介 DS18
  • pwnstack-攻防世界

    pwnstack 攻防世界 text 0000000000400762 giantbranch ubuntu Desktop file pwn2 pwn2 ELF 64 bit LSB executable x86 64 version 1
  • new String(value.getBytes (“iso8859-1“),“utf-8“)

    tomcat容器默认采用了iso 8859 1的编码方法 通过本为UTF 8编码却被tomcat用iso 8859 1解码的字进行恢复 其将解码后的字通过iso 8859 1反解码成二进制数组 再将该字节数组用UTF 8解码 最终被new
  • nodes are available: 1 node(s) had taints that the pod didn‘t tolerate

    记录最近玩k8s创建pod部署服务老是出现pending 并且查看详情describe的时候出现 nodes are available 1 node s had taints that the pod didn t tolerate 经过
  • Matlab 指针函数,MATLAB / Simulink - C MEX S函数:总线信号和涉及指针的传统C结构之间的转换...

    目前我正在MATLAB Simulink R2017b 中将遗留C代码实现为C MEX S函数 我已经在Entry at MathWorks MATLAB Answers上放了一个重复的条目 遗留函数作为一般规则指针指向涉及指向其他结构的指
  • vue3使用百度地图(详)

    前情提要 提示 该博客vue采用vue3 使用百度地图通过组件vue baidu map 3x 组件官网 https map heifahaizei com doc baidu map html 下面会从头开始介绍如何使用百度地图以及常用组
  • Java学习笔记 --- 成员方法

    一 成员方法 基本介绍 在某些情况下 我们需要定义成员方法 简称方法 比如人类 除了有一些属性外 年龄 姓名 我们人类还有一些行为比如 可以说花 跑步 通过学习 还可以做算术题 这时就需要成员方法才能完成 案例演示 public class
  • 1.3 C++ 关键字升级

    实用性增强 遍历数组的方式 关键字的升级 register vs volatile 仅能修饰局部变量 不能修饰全局变量和函数 修饰的变量不能通过 取地址 C 当对register变量取地址时 会将该变量重新保存到内存中 寄存器变量 提高运行
  • HashMap和HashSet

    一 什么是HashSet HashSet实现了Set接口 它不允许集合中有重复的元素 而且集合中的元素都是无序的 在将对象储存在HashSet之前 要确保对象重写了equals 方法和hashCode 方法 这样才能比较对象是否相等 以确保
  • 服务器级的kvm维修,企业级KVM解决方案 Altusen KM0932评测

    IT168评测中心 KVM多电脑切换器是一种可以通过由单一键盘 Keyboard 显示器 Video 及鼠标 Mouse 组成的控制端集中管理多台电脑的硬件装置 是现代数据中心的基础设备之一 使用KVM可以有效地节约机房空间 并有效地提升机
  • Linux 查看CPU架构及内核版本

    涉及arch命令和 proc version文件 1 查看CPU架构 有些软件的安装需要和CPU架构相匹配 如JDK等等 所以需要确定主机的CPU架构类型 可使用命令arch查看Linux系统的CPU架构 如下 arch 2 查看内核版本
  • 国家网络安全宣传周知识竞赛活动小程序界面分享

    国家网络安全宣传周知识竞赛活动小程序界面分享
  • el-menu多级动态菜单渲染

    使用el menu时往往会遇到动态渲染使用场景 安装和引用element暂不赘叙 对其使用方法不是很熟悉的小伙伴可以去官网按照指引完成使用 先简单叙述一下渲染思路 首先我们要知道要渲染一个多级菜单的过程实际上就是对后端给我们的多层数据格式进
  • 后端研发Redis必知必会

    本篇内容完全偏向于实践 也是后端开发常用到的知识 关于Redis原理与概念性的内容会另起一篇来说明 可以根据目录来选择自己所需要的内容来阅读 文章目录 1 redis安装 1 1 ubuntu上安装redis 1 2 centos上安装re
  • 少儿编程课程和乐高机器人有什么不同

    少儿编程课程和乐高机器人有什么不同 现在很多的家长开始给孩子选择课外学习的课程 可以说是越来越高科技 就拿现在人工智能的发展来说 很多的家长开始给孩子选择少儿编程的课程来让孩子学习 但是很多的家长想要孩子去学习的时候 不知道少儿编程和乐高机
  • Unity开发详解之旋转、移动、碰撞(3/6)

    在前两篇中 我们已经创建好了场景和玩家对象 下面让玩家对象动起来 玩家对象旋转 using System Collections using System Collections Generic using UnityEngine publ
  • QString::arg: Argument missing的报错解决办法

    当Qt sqlite 插入语句query exec insert into qper values 1 2 3 4 5 6 arg 参数1 arg 参数2 arg 参数3 arg 参数4 arg 参数5 arg 参数6 出现报错时 可将参数
  • inputstreamreader用法

    InputStreamReader 是 Java 中的一个类 它可以将字节输入流转换为字符输入流 它可以读取字节输入流 并使用指定的字符集将字节解码为字符 它的常用用法如下 从文件读取内容 FileInputStream fis new F
  • 807-C++多继承下,派生类对象有几张虚函数表?

    C 多继承下 派生类对象有几张虚函数表 我们看下面这个示例 include