【问题标题】:copy base class data from one derived class to another将基类数据从一个派生类复制到另一个
【发布时间】:2013-03-18 07:44:24
【问题描述】:

假设我有三个类:

typedef struct base
{
    float A;
    float B;
    ...
    base() : A(1.0f), B(1.0f) {}
} base;

class derived1 : base
{
    int C;
    int D;
};

class derived2 : base
{
    int E;
    int F;
};

我想将基类数据从一个派生类对象复制到另一个。
执行以下操作是否安全,仅将 A、B 等的基类值从一个对象复制到另一个对象?

derived1* object1 = new derived1;
derived2* object2 = new derived2;

void make_object1()
{
    object1->C = 2;
    object1->D = 3;
}

void make_object2()
}
    object2->A = 4;
    object2->B = 5;
    object2->E = 6;
    object2->F = 7;
}

void transfer_base()
{
    *((base*)object1) = *((base*)object2);
}

假设我的程序经常需要执行此类操作,是否有更好(更快的代码)方法来完成此操作? 我这样做的原因是我编写了一个模拟和图形渲染器。我想尽可能有效地仅使用从模拟对象中选择的数据来更新图形显示对象。模拟非常占用 CPU... 到目前为止,这种方法似乎很有效,但是我担心我可能忽略了一些东西......

【问题讨论】:

    标签: c++ inheritance casting


    【解决方案1】:

    代码

    *((base*)object1) = *((base*)object2);
    

    非常不安全,因为 C 风格的强制转换几乎可以做任何事情。比如重新解释,或者抛弃一成不变。

    相反,如果您想调用base::operator=,则显式调用。显式 = 好,隐式 = 坏。

    即,

    object1->base::operator=( *object2 );
    

    这仍然不“安全”,因为切片可能会破坏派生类的类不变量。任何试图了解这段代码中发生的事情的人都可能会对基类子对象中值的突然变化感到惊讶,并浪费大量时间试图确定这些值的来源。但至少它没有 C 风格的强制转换那么糟糕。

    【讨论】:

    • 请问,您的句柄“Cheers and hth. - Alf”是什么意思?
    • @SebbyJohanns:你现在可以看看Wikipedia
    • 如果我知道要搜索什么,我确实会知道。现在我看到“hth”是一个闭幕词,谢谢。
    【解决方案2】:

    相反,为什么不在基类中创建自己的赋值方法(删除不需要的 C 工件类型定义):

    struct base
    {
        float A;
        float B;
        ...
        base() : A(1.0f), B(1.0f) {}
        base& assign_base(const base& right) { A = right.A; B = right.B; }
    };
    

    那你就直接说

    der1.assign_base(der2);
    

    【讨论】:

    • 编译器已经生成了该方法,名称为operator=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2010-11-15
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多