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++多继承下,派生类对象有几张虚函数表? 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 心理学的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