投射给孩子

2023-12-14

我实际上想做的是投射一个构造的moneypunct to the punct_facet in 这个问题无需编写复制构造函数,如下所示这个答案.

但为了写一个最小、完整、可验证的示例假设我有这两个课程:

class Parent{
public:
    Parent(Complex& args);
    Parent operator=(const Parent&) = delete;
    Parent(const Parent&) = delete;
    Parent() = default;

    virtual void func();
private:
    Complex members;
};

class Child : public Parent{
public:
    virtual void func();
};

我可以构建一个Parent or Child使用默认构造函数,但不会设置Complex members。所以说我被给予Parent foo它是使用自定义构造函数构建的,我想使用foo对象只是Child's func方法。我怎么做?直上来的dynamic_cast<Child*>(&foo)段错误,所以可能没有办法:http://ideone.com/JcAaxd

auto bar = dynamic_cast<Child*>(&foo);

我必须做一个Child构造函数需要一个Parent并在内部复制它?或者有什么方法可以投射bar存在?

EDIT:

为了深入了解我的实际问题,Parent从这个例子是moneypunct,这是在标准中实现的,所以我无法修改它。

class punct_facet是我的,并且Child从示例来看,它继承了moneypunct如果我试图保持实现独立,我什至不能在内部使用moneypunct的成员变量。

这意味着我必须数据镜像所有moneypunct中的成员变量punct_facet并复制构造它们punct_facet建造。这会导致对象的大小是所需大小的两倍,并且需要我重新实现所有内容moneypunct功能。

显然这是不可取的,但我能找到的唯一方法是采用先前构建的moneypunct并将其视为punct_facet按照这个问题的要求。


它不会像你想象的那样工作,因为你已经做了这个功能func虚拟的。这意味着即使您将指针转换为Parent指向一个指针Child, the func()该对象的仍然是Parent::func().

现在,理论上你可以这样做:

#include <iostream>

class Parent
{
public:
        virtual void foo() { std::cout << "parent" << std::endl; }
};

class Child : public Parent
{
public:
        virtual void foo() { std::cout << "child" << std::endl; }
};

int main()
{
        Child child;
        child.foo(); // "child"
        child.Parent::foo(); // "parent"
        Parent parent;
        parent.foo(); // "parent"
        ((Child*)(&parent))->foo(); // still "parent"
        ((Child*)(&parent))->Child::foo(); // "child"
        return 0;
}

虽然我可能会因为发布这个损坏的代码而收到一些反对票,但我认为有必要展示这种情况下发生的情况。您需要转换两者,即指向对象的指针,然后准确指定您要调用的函数。

根据您正在做的事情,最好使用友元类来完成:

#include <iostream>

class ParentHelper;
class ChildHelper;
class Parent
{
    friend class ParentHelper;
    friend class ChildHelper;
private:
    int a=5;
};

class ParentHelper
{
public:
    virtual void func(Parent *p)
    {
        std::cout << "parent helper, but i see a " << p->a << std::endl;
    }
};

class ChildHelper : public ParentHelper
{
public:
    virtual void func(Parent *p)
    {
        std::cout << "child helper, but i see a also " << p->a << std::endl;
    }
};

void foo(Parent* p, ParentHelper *h)
{
    h->func(p);
}

int main()
{
    Parent p;
    ParentHelper ph;
    ChildHelper ch;

    ph.func(&p);
    ch.func(&p);

    foo(&p, &ph);
    foo(&p, &ch);

    return 0;
}

注意几件事:

  1. 友谊不能继承,因此您必须将所有您想要使用的子项列出到 ParentHelper。
  2. 然而,它确实为您提供了一种按原样访问父类的所有数据成员的方法,它不会导致一些奇怪的行为。
  3. 这可能仍然不是您想要的,但从您的问题来看,我认为它可能会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

投射给孩子 的相关文章

随机推荐

  • Android Studio 突然无法解析符号

    Android Studio 0 4 2 工作正常 今天我打开它 几乎所有内容都是红色的 并且自动完成功能已停止工作 我查看了导入 AS 似乎告诉我它找不到android support v4突然之间 为我提供了删除未使用的导入的选项 an
  • Java - 使用不带 lambda 表达式的谓词

    我有以下要求 员工 java public boolean isAdult Integer age if age gt 18 return true return false 谓词 java private Integer age Pred
  • 如何将 jQuery 插件功能限制为仅某些元素?

    我查看了 jQuery 插件网站 它教我如何编写基本插件 function fn maxHeight function var max 0 this each function max Math max max this height re
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一
  • 如何使用Python高效地在另一个字符串列表中搜索字符串列表?

    我有两个名称 字符串 列表 如下所示 executives Brian Olsavsky Some Guy Some Lady analysts Justin Post Some Dude Some Chick 我需要找到这些名称出现在如下
  • 当我使用 MKL 时,为什么 Tensorflow 会发出有关 AVX2 的警告?

    我正在使用具有 MKL 支持的 Tensorflow Anaconda 发行版 from tensorflow python framework import test util test util IsMklEnabled 这段代码打印T
  • 如何暂停和恢复 javascript 计时器 [重复]

    这个问题在这里已经有答案了 我有一个工作正常的计时器 但我需要能够暂停并在那之后恢复它 如果有人能帮助我 我将不胜感激
  • getUserMedia 在 Android Chrome 上冻结在第一帧

    我在桌面浏览器上有一个支持 getUserMedia Api 的工作代码 我可以在 div 中正确地看到网络摄像头的视频预览videoPreview 然而 当在 Android 设备上运行时 当我接受在 Chrome 浏览器中共享照片时 相
  • 在 JavaScript 中使用 JSON 将数组存储在 localStorage 中

    我已经参考了这个问题并为我工作 so q1 现在的问题是我使用 JSON stringify 和 JSON parse 将数组存储在 localStorage 中 但是 当我再次运行代码并尝试在 localStorage 上使用 JSON
  • JSF 2:未为错误页面呈现 Facelets 组合(模板)

    我在 Java EE 6 应用程序服务器 GlassFish v3 中使用 JSF 2 0 和 Facelets 我在 web xml 中配置了一个异常错误页面
  • Javascript Fullcalendar - 复制事件

    我在我的项目中使用 Fullcalendar http arshaw com fullcalendar 它通过 json 源获取事件 我想为用户提供将日历上的一个事件复制到另一天的选项 并且我想使用拖动来实现这一点 嗯 这是客户的要求 但拖
  • gmaps4rails 单标记自动缩放

    我正在尝试遵循答案here当地图上显示单个标记时缩小一点 默认情况下 我已经尝试了下面的代码 并生成了工作地图 但是更改 setZoom 没有效果 另外 我从 firebug 收到以下错误 下面的代码
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 我如何知道 `git gc --auto` 是否做了什么?

    我在跑git gc auto作为自动保存脚本的一部分 我想进行进一步的清理 如果git gc auto已经做了一些事情 但我想避免麻烦 如果git gc auto感觉不需要做某事 有没有办法检查返回值git gc auto 或者事先检查是否
  • 如何将wav文件中的数据读取到数组

    我需要将 wav 文件的所有样本放入一个数组 或者两个 如果您需要这样做以保持立体声 以便我可以对它们进行一些修改 我想知道这是否容易完成 最好没有外部库 我没有阅读声音文件的经验 所以我对这个主题了解不多 这段代码应该可以解决问题 它将波
  • 未通过 Smart Lock API 在应用程序中检索到关联网站的密码

    I ve 关联我的 https 网站和应用程序以共享存储的凭据并收到了该协会已上线的确认信息 但是当我致电CredentialsApi request 方法在我的应用程序中 我无法从我的网站检索使用 Chrome 密码管理器保存的任何凭据
  • 处理我的 Android 应用程序中的文本视图链接单击

    我目前正在 TextView 中渲染 HTML 输入 如下所示 tv setText Html fromHtml a href test test a 显示的 HTML 是通过外部资源提供给我的 因此我无法随意更改内容 但我当然可以对 HT
  • 片段中的函数使模拟器崩溃

    当我将函数放入其中时发生错误onCreateView in menu1 Fragment java 提前抱歉 因为我也会放置我的日志 所以这可能会使我的帖子有点大 所以我会告诉你布局 我是新来的 很抱歉有很多问题 如果我不添加该函数 代码就
  • 记录有共同的基类吗?

    在 NET 类型系统中 所有引用类型都派生自System Object 所有值类型来自System ValueType我认为 是否也有一个共同的基类 record类型源自 如果没有 为什么不呢 是否还有一个所有记录类型派生自的公共基类 不
  • 投射给孩子

    我实际上想做的是投射一个构造的moneypunct to the punct facet in 这个问题无需编写复制构造函数 如下所示这个答案 但为了写一个最小 完整 可验证的示例假设我有这两个课程 class Parent public