假设我有三个班级:
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 ...... 到目前为止,这种方法似乎有效,但我担心可能会有一些我忽略的东西......
答案 0 :(得分:3)
代码
*((base*)object1) = *((base*)object2);
是非常不安全的,因为C样式转换可以做任何事情。如重新解释,或抛弃常数。
相反,如果要调用base::operator=
,则明确调用 。 Excplicit = good,implicit = bad。
即,
object1->base::operator=( *object2 );
这仍然不是“安全的”,因为切片可能会破坏派生类的类不变量。任何试图处理此代码中发生的事情的人都可能对基类子对象中值的突然变化感到惊讶,并且浪费了大量时间来确定这些值来自何处。但至少它没有C风格的那样糟糕。
答案 1 :(得分:0)
相反,为什么不在基类中创建自己的赋值方法(删除不需要的C-artifact类型deffing):
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);