在C++中,为什么指针转换时地址会改变?

2023-11-30

以下是代码:

#include <iostream>
using namespace std;

class B1 {
public:

  virtual void f1() {
      cout << "B1\n";
      }
};

class B2 {
public:

  virtual void f1() {
      cout << "B2\n";
      }
};        

class D : public B1, public B2 {
public:
  void f1() {
      cout << "OK\n" ;
  }
};

int main () {

D dd;    
B1 *b1d = &dd;
B2 *b2d = &dd;
D *ddd = &dd;

cout << b1d << endl;
cout << b2d << endl;
cout << ddd << endl;

b1d -> f1();
b2d -> f1();
ddd -> f1();
}

输出是:

0x79ffdf842ee0
0x79ffdf842ee8
0x79ffdf842ee0
OK
OK
OK

这对我来说看起来很困惑,因为我期望b1d and b2d与他们都指向的相同dd。然而,价值b1d and b2d根据结果​​不同。我认为这可能与类型转换有关,但我不确定它是如何工作的。

有人对此有想法吗?


D继承自B1 andB2.

Since B1是从第一个继承的B1对象的一部分将首先被构造,然后是B2然后将创建对象的一部分D.

因此,当您将派生类型的指针强制转换为基类型时,您所看到的是这些部分在内存中的位置的差异。

b1d and ddd具有相同的地址,因为它们都指向内存中类的开头。

b2d是偏移的,因为它指向的开始B2部分D.

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

在C++中,为什么指针转换时地址会改变? 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

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

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

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

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • 如何在 Javascript 中检查数组是否为空数组

    In my node js 6 10应用程序 我试图在我的数组中识别如下所示 这种嵌套可以进行 n 层 并且可以在任何层的数组中包含元素 我怎样才能做到这一点 谢谢 P S 我知道我可以使用 n 级 for 循环来做到这一点 但想知道更优化
  • 如何在鼠标悬停在链接上时在链接页面的小弹出窗口中显示实时预览?

    如何在鼠标悬停在链接上时在链接页面的小弹出窗口中显示实时预览 像这样 http cssglobe com lab tooltip 03 但实时预览 您可以使用 iframe 在鼠标悬停时显示页面预览 box display none wid
  • 对齐多个 XYChart 的 X 轴

    我有两个XYChart我想垂直对齐显示 这两个图共享相同的 x 轴 但它们使用不同的数据集 这些值不在同一数量级 这使得 y 轴标签的大小差异很大 最终 两个x轴不再对齐 我的目标是对齐这些 x 轴 一种建议的解决方案提供了一种解决方法 即
  • 组合框所选项目 WPF c#

    我想在组合框 wpf 中获取所选项目 但它返回System Data DataRowView 我的 xaml 代码
  • 将 Obserable 集合绑定到 UWP 中的 MenuFlyoutSubItem

    目前我得到 属性 Items 没有可访问的设置器 我如何修改此控件以允许我将集合绑定到它 并且可能只是将集合中对象的属性设置为项目的文本属性
  • 使用比较器比较不同的对象类型

    我需要编写一个比较器 它接受类型 A 的对象 A 和类型 B 的对象 B 这两个对象不是公共对象的扩展 它们确实不同 但我需要通过其中的共同字段来比较这两个对象 我必须使用比较器接口 因为对象存储在 Set 中 并且之后我必须使用 Coll
  • 如何在 gmock Expect_call 中对结构参数进行部分匹配

    struct obj int a string str string str2 bool operator const obj o const if a o a str o str str2 o str2 return true retur
  • 在java中将层次列表转换为平面列表

    我有一个层次结构list如下所示 我想将其转换为公寓list 我写了一个方法叫convertToFlatList并已经使用过它 但最终结果中缺少一些元素 我做错了什么 还有比我用来将列表转换为平面列表更好的方法吗 我添加了示例代码和类似于我
  • 带有 OpenJDK 11 且没有 Spring Context 的 AspectJ 1.9.4 无法作为依赖模块工作

    我正在尝试使用 AspectJ 创建自定义加载时注释 在没有 Spring Context 的情况下打开 JDK11 它在模块内运行良好 注释在类加载时编织 方面在运行时执行 没问题 但是当aspectJ实现模块添加为对另一个模块的依赖时
  • build.gradle 依赖项自动更新

    compile com google android gms play services 8 3 0 compile com android support support v4 22 2 1 compile com android sup
  • 将 BitmapImage 加载到 WriteableBitmap 但不存在方法

    的构造函数WriteableBitmapWindows 8 的类仅接受两个参数 该对象的高度和宽度 同时 Silverlight 接受BitmapImage对象作为参数 在 MSDN 上验证 WriteableBitmap Writeabl
  • Firebase 查询从两个节点一起获取数据

    我在 Firebase 实时数据库中有一个名为 Posts 的根节点 在其中 我有两个名为 ImagePosts 和 TextPosts 的节点 在 ImagePosts 和 TextPosts 内 我有各种帖子的 postId 在 pos
  • 非法指令:运行任何 Tensorflow 程序时出现 4 错误

    我正在尝试训练 Tensorflow 卷积神经网络 无论我运行程序的环境如何 我总是会收到一个神秘的错误 在 Jupyter Notebook 中 内核会直接死掉 在终端中 我得到 非法指令 4 没有回溯 在 Pycharm 中 我得到 进
  • 如何显示和隐藏 UISearchDisplayController 的 UISearchBar

    我有一个位于导航右侧的按钮搜索 这是我的代码 UIButton btnSearch UIButton buttonWithType UIButtonTypeCustom btnSearch frame CGRectMake 0 0 22 2
  • Fabric.io 中的 API 密钥和 Build Secret 有什么区别?

    我在 Android 应用程序中使用 Fabric io 的 Crashlytics 工具 我已将 API 密钥放入清单文件中 Fabric 还提供了构建秘密字符串 但没有使用说明 Fabric 可能假设用户事先了解如何使用 BUILD S
  • 映射 servlet 来满足我的请求

    我想映射一个 servlet 来服务包含 app 并以 html 结尾的请求 如下所示
  • 使用 GSON 加载非常重的流

    我正在尝试读取非常重的 JSON 超过 6000 个对象 并将它们存储在哈希映射上 以便稍后将其插入到我的数据库中 但问题是我面临 OOM 这是我沉重的 JSON 造成的 但是 GSON 库应该让我摆脱这种情况 但事实并非如此 有任何想法吗
  • 获取默认选择颜色?

    I can change theCSS选择颜色 但我怎样才能get浏览器 操作系统默认选择以便我可以在其他地方使用它 例如在 Ubuntu Chrome 上 文本以橙色突出显示 我想将同样的风格应用到 li 当我用鼠标悬停在它上面时 CSS
  • 全局检测触摸

    我试图弄清楚如何解决这个 相当 简单的问题 但我失败得很惨 所以我真的需要你的建议 我的应用程序由一个带有多个选项卡的 uitabbar 组成 在其中一个中 我有一堆 UIImageView 每个视图代表图片的缩略图 类似地 当您通过按住应
  • 在C++中,为什么指针转换时地址会改变?

    以下是代码 include