将基类数据从一个派生类复制到另一个派生类

copy base class data from one derived class to another

本文关键字:派生 一个 复制 另一个 数据 基类      更新时间:2023-10-16

假设我有三个类:

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密集的…到目前为止,这种方法似乎是有效的,但我担心可能有一些我忽略了…

代码

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

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

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

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

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

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

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);
相关文章: