从 Base 向下转换为 Derive Segmentation 错误

2024-02-10

我正在学习动态转换并搜索了很多网站,我得出的结论是动态转换可以从基础转换为派生并派生到基础。 但是,当我从 Base 进行强制转换以派生时,它会出现分段错误。 这是代码:

我期望从“A”中得到一个,但即使在铸造之后它也给了我一个“D”


class A
{
  public:
  virtual ~A(){} 
  virtual void print()
  {
    std::cout << "from A"<<std::endl;
  }
  };
class B:  virtual public A
{
  public:
    void print()
  {
    std::cout << "from B"<<std::endl;
  }
};       
class C: virtual public A
{
  public:
    void print()
  {
    std::cout << "from C"<<std::endl;
  }
};      
class D: public B, public C
{
  public:
    void print()
  {
    std::cout << "from D"<<std::endl;
  }
};


int main(){
    A* b = new B;
    A* c = new C;
    A* d = new D;
    A* a = new A;

    B* down = dynamic_cast<B*>(a);  // this gives me problem
    down->print();

    A* up= dynamic_cast<A*>(d); // upcasten dont print from A either
    up->print();

使用时dynamic_cast要转换指针,您需要在访问结果指针之前检查其转换是否有效。访问无效指针会导致未定义的行为。

    B* down = dynamic_cast<B*>(a);
    if (down == 0) {
        std::cerr << "a is not a B!\n";
    } else {
        down->print();
    }

您不需要使用dynamic_cast用于“向上铸造”。您可以将派生分配给父级。如果关系不存在,您将收到编译时错误。

    A* up= d;
    up->print();

Since print是一个虚方法,up->print()解决派生的实施。但是,如果您希望查看基础的实现,您可以显式调用它。

    d->A::print();

在线尝试一下! https://tio.run/##rZHRaoMwFIbv8xRn7kZLhV1HKxh9jMFIk3QENAYTW0Zxr@6iia3QDcZYIBA@zn@@H2Vap@@MTc9SsWbgAnLZGdsL2hYTa6gxUKIrAtDDsZEMu9dZ9nagDXyWcXIdYUPOneSge6lsnDg8xwCM5RizbrCQ5xCd@q6FMsrzBQvFm8xNjfPNkPcRfN/orQ8V4Ncq8qgaM/An@Cr8f7rqZ12w1Xi1kP36qv7sq7/zIYRcEFoqlftDS7TcwREOoMQFSLYSFkh1IzyQ@kZoIKXbOiPihrqLcpR/KNpK9saosTnZFTFNfEqeIPYzB3hJQvd7f9H3S38K0oDqrFOQp1cV@fAIojFiE5o3pUX4FGEGre0G7Xp4OOjN1EJ4WpQY39g4TV8

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

从 Base 向下转换为 Derive Segmentation 错误 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 静态成员函数与C语言绑定?

    以下 C 代码可使用 Visual C 和 g 进行编译 struct S static void foo extern C void S foo struct T static void foo extern C void T foo a
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 错误 C2064:术语不计算为采用 1 个参数的函数

    class Student bool Graduate return m bGraduate class School vector
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • C++ std:.auto_ptr 或 std::unique_ptr (支持多个编译器,甚至是旧的 C++03 编译器)?

    我正在尝试更新一些 C 代码 我想转向更现代的代码 c 11 但我仍然需要使用一些较旧的编译器 兼容 c 03 来编译代码 因为支持的平台限制 我知道在 C 11 编译器中 std auto ptr 已被弃用 但由于较旧的编译器支持 我不能
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数

随机推荐

  • Oracle:非池连接和 DRCP 之间的区别

    我实际上正在读书Oracle cx Oracle http www oracle com technetwork articles dsl python 091105 html教程 在那里我遇到了非池连接和 DRCP 基本上我不是 DBA
  • 使用 SavedStateHandle 引用共享视图模型

    我有单个活动应用程序和片段数量 其中一些片段正在使用我的视图模型 通常如下所示 private val myViewModel MyViewModel by sharedViewModel 如果我想同时拥有模型怎么办shared并用 Sav
  • 使用 EFCore 设置带有私有字段的自定义外键列名称

    我有以下数据模型 public class Foo public Foo int barId BarId barId private int BarId public Bar Bar get private set public class
  • 检查函数中是否缺少参数

    这是检查函数中缺少参数的正确方法吗 这适用于所有浏览器吗 IE 怎么样 function getName name name name null name default return name 检查参数的方法取决于您传递给函数的信息类型以
  • 单击后如何更改回收器视图中的特定图像

    我想更改 recyclerview 中单击项目的透视图像 知道发生了什么 如果我单击项目 2 图像会在列表中的随机项目位置发生变化 public class MyRecyclerViewAdapter extends RecyclerVie
  • 设置Xcode项目的默认方案

    我有一个 Xcode 项目 MyApp 有 1 个目标 MyApp 其中包括另一个项目 LibProject 有 2 个目标 lib 和 app 我在 Xcode ui 中选择了自动创建方案 当我第一次打开项目时 它确实创建了方案 但选择了
  • 是否可以使用 Azure API 管理和 Azure ACS (kubernetes) 作为前端和后端?

    我想在 Azure 上创建一个简单的架构 我的高级设计与下图非常相似 来源 https www import io post using amazon lambda and api gateway https www import io p
  • 搜索和替换:正确的快捷方式是什么?

    非常简单的困境 用户需要能够在大段文本中进行搜索和替换 执行此操作的代码是小菜一碟 那里没有问题 奇迹般有效 别为此伤透脑筋 就这样解决了 这不是问题 No problem is defining a good shortcut for t
  • iOS 6 中完成块的dispatch_get_current_queue() 的替代品?

    我有一个接受块和完成块的方法 第一个块应该在后台运行 而完成块应该在调用该方法的任何队列中运行 对于后者我总是使用dispatch get current queue 但似乎它在 iOS 6 或更高版本中已被弃用 我应该用什么来代替 在调用
  • 快速过滤数组

    如何通过一个或多个标志过滤一组自定义对象 let flags New product Season 2014 Season 2015 Product available 使用一个标志或多个静态标志很容易 let filteredArray
  • 当 order by 与 where 子句不同时,有什么方法可以避免文件排序?

    我有一个非常简单的查询 表类型 InnoDb 并且EXPLAIN说 MySQL 必须执行额外的操作来找出如何按排序顺序检索行 SELECT FROM comments WHERE commentable id 1976 ORDER BY c
  • 多次激活像素以进行 Facebook 像素跟踪

    我正在使用从 Facebook 获得的一些 Javascript 来执行 跟踪 像素 但是 当我使用 Facebook Pixel Helper 查看一切是否正常工作时 它表明存在错误 并且像素被多次激活 它没有给出如何解决此类错误的说明
  • 以“主从”方式将 DataGridView 绑定到实体

    我正在尝试在两个 DataGridView 之间建立主从关系 我有一个 EntityModel 其中有两个实体通过 ClientCommissions 关联连接 它们是从现有数据库生成的 并且具有运行良好的导航属性 证明 使用提到的 Ent
  • 使用 TinyMCE 突出显示文本

    目前我有一个使用 TinyMCE 的文本区域 http fiddle tinymce com D2gaab http fiddle tinymce com D2gaab 我想突出显示左大括号 右大括号之间的文本 有人知道这是否可能 以及我该
  • 在 CSS 中使用非常具体的选择器有优势吗?

    我知道在 jQuery 中 使用选择器时更具体是有利的 这样 jQuery 就不必遍历整个 DOM 来找到您要查找的内容 例如 span description 比仅仅更好 description 如果我知道description类仅适用于
  • Pandas - 基于列对行进行分组,并用非空值替换 NaN

    我正在尝试基于目标 group by 列 在数据帧上使用字符串创建一些聚合 假设我有以下包含 4 列的数据框 我想根据列 Col1 对所有行进行分组 在这种情况下 o NaN 组的值不为空 期望的输出是这样的 我也尝试使用普通的 impor
  • 从计算着色器中的 RWTexture2D 加载

    据我所知 HLSL 着色器模型 5 0 存在一个限制 即无法从非标量类型的 RWTexture2D 资源加载数据 也就是说 以下行为是非法的 RWTexture2D
  • 与XBoard(国际象棋引擎)通信(C++/C)

    我只是在尝试制作一个基本的国际象棋引擎 我从中得到了很多建议http web archive org web 20070704121716 http www brucemo com compchess programming alphabe
  • 防止在 ASP.NET 输入字段中按 Enter 进行回发

    我在 javascript 和 asp net 中的 Enter 键有问题 我有一个像这样的控件 带有一个 textchanged 事件 它会进行查找 但我想在用户输入时控制它
  • 从 Base 向下转换为 Derive Segmentation 错误

    我正在学习动态转换并搜索了很多网站 我得出的结论是动态转换可以从基础转换为派生并派生到基础 但是 当我从 Base 进行强制转换以派生时 它会出现分段错误 这是代码 我期望从 A 中得到一个 但即使在铸造之后它也给了我一个 D class